Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var foo = (function () {
var y = 20;
return function () {
alert(y);
};
})();
foo(); // 20
alert(foo.__parent__.y); // 20
foo.__parent__.y = 30;
foo(); // 30
Мы передаем пустой объект в качестве контейнера для возвращаемого значения, поскольку return не может быть использован в функции eval().
...
this.evalInContext = function(cmd){
return eval(cmd);
}
...
function getVar(obj, name){
return obj.evalInContext(name);
}
cmd использование return выдает ошибку. В любом случае я использовал свой подход для задания списка переменных и их получения одним вызовом функции. Тогда пустой объект наполняется переменными из списка.

Увы у меня прямо противоположный опыт.
var Point = function(){};
Point.prototype = {
x: 0,
y: 0,
kind: 'point',
setCoords: function(x, y){
this.x = Number(x);
this.y = Number(x);
}
}
var Appointment = function(date){
if (date)
this.date = date;
}
Appointment.prototype = new Point();
Appointment.prototype.kind = 'appointment';
Appointment.prototype.date = null;
Appointment.prototype.setDate = function(){ .. };
...
var a = new Point();
var b = new Point();
a.x === b.x; // указывают на одно значение 0
Point.prototype.x = 10;
alert(a.x); // будет 10
a.x = 1;
b.x = 1;
// после этого у экземпляров будет собственные значения
delete a.x; // а после этого будет опять браться из прототипа
Appointment.prototype = new Point(); есть зло. А делать надо так:var Tmp = function() { }
Tmp.prototype = Point.prototype
Appointment.prototype = new Tmp()
Appointment.prototype.constructor = Appointment;
function Rect(){}
Rect.prototype.pt1 = new Point();
Rect.prototype.pt2 = new Point();
var r1 = new Rect();
var r2 = new Rect();
r1.pt1.x = 100;
r2.pt1.x = 200;
alert(r1.pt1.x); // 200
<?php
class Rect {
private $from = new Point();
}
И в частности то, что Appointment.prototype = new Point(); есть зло. А делать надо так:
clazz.prototype = new parent; зовет реальный, а не специальный конструктор и тут уж как повезет. Он так же работет некорректно, если в цепочке более двух классов. Вызов базового класса всегда идет к самому базовому, а не к тому от кого наследовался (хотя конструкторы работают корректно). Я люблю более надежные решения.(function (global, document, jQuery, undefined) {
var localVar,
YourClass = {
a: function () {},
b: function () {},
c: function (a, b, c) {}
};
// Экспортируем часть объекта во все платформы (node.js + браузер)
global.YourClass = {
// Вариант экспорта 1 - элегантный
a: YourClass.a.bind(YourClass),
// Вариант экспорта 2
c: function (a, b, c) {
return YourClass.c(a, b, c);
}
};
}(typeof exports === 'undefined' ? this : exports, document, jQuery));
Mocking private в JavaScript