Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var myClass = {
constructor: function(){},
method: function(){}
};
myClass.constructor.prototype = myClass;
var instance = new myClass.constructor;
__proto__ is deprecated? Или нет? Как c поддержкой в Strict Mode?__proto__?var donald = {name: "Donald", __proto__: talkingDuck$};var protohack = (function() {
function Clone(properties) {
for (var propName in properties){
this[propName] = properties[propName];
}
}
if ({__proto__: Clone.prototype} instanceof Clone) {
return new Function('o', 'return o;'); // No-op, от глобального скопа
}
return function(o) {
if (!o || !o.__proto__ || typeof o.__proto__ !== 'object') {
return o; // В объекте не перекрывается __proto__, или это вообще не объект. Возвращаем обратно как есть
}
Clone.prototype = o.__proto__;
delete o.__proto__;
return new Clone(o); // Возвращаем новый объект с нужным [[prototype]]
}
})();var donald = protohack({name: "Donald", __proto__: talkingDuck$}); вернет одно и тоже и в ES5 и в дремучем ES3. var a = { ref: HUGE_OBJECT };
var b = clone(a);
b.ref = null;
a = null;
// а HUGE_OBJECT-то утёк
jQuery.extend(true, {}, oldObject);
… lazy shallow copy…
it would not affect the cloned object (prototype)
… lazy shallow copy…
it would not affect the cloned object (prototype)
var obj = {
s : {
ss: 1
}
};
var cln = clone (obj);
// и
var cln = clone.byProto (obj, {});
// и
var cln = clone.byConstructor (obj, {});
// и
var cln = clone.byObjectCreate (obj, {});
cln.s.ss = 5;
console.log ( obj.s.ss ); // 5
obj.$clone();
cln.$clone();
clone function produces new objects — Clones.
Clone object — this is the lazy shallow copy, i.e., it is actually not a copy, it's just a reference to the object, with one difference: if you will add/replace any of its properties, it would not affect the cloned object (prototype).
All JavaScript objects are clones of Object.prototype (except itself and objects, created by Object.create(null)).
Вот как всё таки, используя их, мне сделать мне этот would not affect ?
if you will add/REplace any of its properties, it would not affect the cloned object (prototype).
cln.s.ss = 5;
… lazy shallow copy…
clone.clearAllOf(a), для рекурсивного удаления всех свойств. delete лучше вообще не использовать (за исключением очень крайних случаев), от него одно падение производительности. Еще он обладает таким интересным парадоксальным свойством (по крайней мере на V8), что после его применения объем занимаемой объектом памяти может возрасти (а не уменьшится).var p = { a: 1, b: 2 };
var q = clone(p);
q.a++;
var u = clone(p);
u.b++;
some_f(q);
some_f(u);
some_f работает с полями a / b, то some_f будет работать медленнее, чем она работала будь q и u созданы обычным конструктором, потому что они имею разные скрытые классы и как результат доступ к полям становится полиморфным.
Нужны ли в JavaScript классы? часть 2