Baseline Widely available
ÐÑедÑпÑеждение: Ðзменение пÑоÑоÑипа [[Prototype]]
обÑекÑа ÑвлÑеÑÑÑ, по Ñамой пÑиÑоде опÑимизаÑии доÑÑÑпа к ÑвойÑÑвам в ÑовÑеменнÑÑ
движкаÑ
JavaScript, оÑÐµÐ½Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð¹ опеÑаÑией, ÑÑо ÑпÑаведливо Ð´Ð»Ñ Ð»Ñбого бÑаÑзеÑа и движка JavaScript. Ðзменение пÑоÑоÑипов оÑÐµÐ½Ñ Ñонко и обÑиÑно влиÑÐµÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ, пÑиÑÑм ÑÑо влиÑние не огÑаниÑиваеÑÑÑ Ð¿ÑоÑÑо вÑеменем, пÑоведÑннÑм внÑÑÑи меÑода Object.setPrototypeOf()
, оно Ð¼Ð¾Ð¶ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð° лÑбой код, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ð´Ð¾ÑÑÑп к лÑÐ±Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, Ñей пÑоÑоÑип [[Prototype]]
бÑл изменÑн. ÐÑли Ð²Ñ Ð·Ð°Ð±Ð¾ÑиÑеÑÑ Ð¾ пÑоизводиÑелÑноÑÑи, Ð²Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¿ÑоÑоÑип [[Prototype]]
обÑекÑа. ÐмеÑÑо ÑÑого ÑоздайÑе обÑÐµÐºÑ Ñ Ð½ÑжнÑм пÑоÑоÑипом [[Prototype]]
, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода Object.create()
.
ÐеÑод Object.setPrototypeOf()
ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑоÑип (Ñо еÑÑÑ, внÑÑÑеннее ÑвойÑÑво [[Prototype]]
) Ñказанного обÑекÑа в дÑÑгой обÑÐµÐºÑ Ð¸Ð»Ð¸ null
.
Object.setPrototypeOf(obj, prototype);ÐаÑамеÑÑÑ
obj
ÐбÑекÑ, коÑоÑÐ¾Ð¼Ñ ÑÑÑанавливаеÑÑÑ Ð¿ÑоÑоÑип.
prototype
ÐовÑй пÑоÑоÑип обÑекÑа (обÑÐµÐºÑ Ð¸Ð»Ð¸ null
).
ÐÑкидÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение TypeError
, еÑли обÑекÑ, Ñей пÑоÑоÑип [[Prototype]]
ÑвлÑеÑÑÑ Ð½Ðµ ÑаÑÑиÑÑемÑм, ÑоглаÑно меÑÐ¾Ð´Ñ Object.isExtensible()
. Ðе Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð¸Ñего, еÑли паÑамеÑÑ prototype
не ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом или знаÑением null
(Ñо еÑÑÑ, ÑвлÑеÑÑÑ ÑиÑлом, ÑÑÑокой, логиÑеÑким знаÑением или undefined
). РпÑоÑивном ÑлÑÑае меÑод ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑоÑип [[Prototype]]
обÑекÑа obj
в новое знаÑение.
var dict = Object.setPrototypeOf({}, null);
ÐолиÑил
ÐÑполÑзÑÑ ÑÑаÑое ÑвойÑÑво Object.prototype.__proto__
, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ легко опÑеделиÑÑ Object.setPrototypeOf()
, еÑли он еÑÑ Ð½Ðµ доÑÑÑпен:
if (!Object.setPrototypeOf) {
Object.prototype.setPrototypeOf = function (obj, proto) {
if (obj.__proto__) {
obj.__proto__ = proto;
return obj;
} else {
// ÐÑли нÑжно бÑÐ´ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð¿ÑоÑоÑип Ñ Object.create(null) обÑекÑа
var Fn = function () {
for (var key in obj) {
//ÐÑли в обÑÐµÐºÑ Ñже бÑли опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑвойÑÑва
Object.defineProperty(this, key, {
value: obj[key],
});
}
};
Fn.prototype = proto;
return new Fn();
}
};
}
Ðобавление ÑепоÑки пÑоÑоÑипов
СоÑеÑание меÑода Object.getPrototypeOf()
и ÑвойÑÑва Object.prototype.__proto__
позволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑелÑÑ ÑепоÑÐºÑ Ð¿ÑоÑоÑипов к Ð½Ð¾Ð²Ð¾Ð¼Ñ Ð¿ÑоÑоÑÐ¸Ð¿Ñ Ð¾Ð±ÑекÑа:
/**
*** Object.appendChain(@object, @prototype)
*
* ÐÑиÑоединÑÐµÑ Ð¿ÐµÑвÑй неÑодной пÑоÑоÑип ÑепоÑки к Ð½Ð¾Ð²Ð¾Ð¼Ñ Ð¿ÑоÑоÑипÑ.
* ÐозвÑаÑÐ°ÐµÑ @object (еÑли он бÑл пÑимиÑивнÑм знаÑением, оно бÑÐ´ÐµÑ Ð¿ÑеобÑазовано в обÑекÑ).
*
*** Object.appendChain(@object [, "@arg_name_1", "@arg_name_2", "@arg_name_3", "..."], "@function_body")
*** Object.appendChain(@object [, "@arg_name_1, @arg_name_2, @arg_name_3, ..."], "@function_body")
*
* ÐÑиÑоединÑÐµÑ Ð¿ÐµÑвÑй не Ñодной пÑоÑоÑип ÑепоÑки к ÑÐ¾Ð´Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ Function.prototype, заÑем пÑиÑоединÑеÑ
* new Function(["@arg"(s)], "@function_body") к ÑÑой ÑепоÑке.
* ÐозвÑаÑÐ°ÐµÑ ÑÑнкÑиÑ.
*
**/
Object.appendChain = function (oChain, oProto) {
if (arguments.length < 2) {
throw new TypeError("Object.appendChain - Not enough arguments");
}
if (typeof oProto === "number" || typeof oProto === "boolean") {
throw new TypeError(
"second argument to Object.appendChain must be an object or a string",
);
}
var oNewProto = oProto,
oReturn =
(o2nd =
oLast =
oChain instanceof this ? oChain : new oChain.constructor(oChain));
for (
var o1st = this.getPrototypeOf(o2nd);
o1st !== Object.prototype && o1st !== Function.prototype;
o1st = this.getPrototypeOf(o2nd)
) {
o2nd = o1st;
}
if (oProto.constructor === String) {
oNewProto = Function.prototype;
oReturn = Function.apply(null, Array.prototype.slice.call(arguments, 1));
this.setPrototypeOf(oReturn, oLast);
}
this.setPrototypeOf(o2nd, oNewProto);
return oReturn;
};
ÐÑполÑзование ÐеÑвÑй пÑимеÑ: пÑиÑоединение ÑепоÑки к пÑоÑоÑипÑ
function Mammal() {
this.isMammal = "да";
}
function MammalSpecies(sMammalSpecies) {
this.species = sMammalSpecies;
}
MammalSpecies.prototype = new Mammal();
MammalSpecies.prototype.constructor = MammalSpecies;
var oCat = new MammalSpecies("Felis");
alert(oCat.isMammal); // 'да'
function Animal() {
this.breathing = "да";
}
Object.appendChain(oCat, new Animal());
alert(oCat.breathing); // 'да'
ÐÑоÑой пÑимеÑ: пÑеобÑазование пÑимиÑивного знаÑÐµÐ½Ð¸Ñ Ð² ÑкземплÑÑ ÐµÐ³Ð¾ конÑÑÑÑкÑоÑа и пÑиÑоединение его ÑепоÑки к пÑоÑоÑипÑ
function Symbol() {
this.isSymbol = "да";
}
var nPrime = 17;
alert(typeof nPrime); // 'number'
var oPrime = Object.appendChain(nPrime, new Symbol());
alert(oPrime); // '17'
alert(oPrime.isSymbol); // 'да'
alert(typeof oPrime); // 'object'
ТÑеÑий пÑимеÑ: пÑиÑоединение ÑепоÑки к обÑекÑÑ Function.prototype
и новой ÑÑнкÑии к ÑÑой ÑепоÑке
function Person(sName) {
this.identity = sName;
}
var george = Object.appendChain(
new Person("ÐеоÑг"),
'alert("ÐÑивеÑ, паÑни!!");',
);
alert(george.identity); // 'ÐеоÑг'
george(); // 'ÐÑивеÑ, паÑни!!'
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4