Baseline Widely available
ÐеÑод Object.create()
ÑоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ Ñ ÑказаннÑм пÑоÑоÑипом и ÑвойÑÑвами.
Object.create(proto[, propertiesObject])ÐаÑамеÑÑÑ
proto
ÐбÑекÑ, коÑоÑÑй ÑÑÐ°Ð½ÐµÑ Ð¿ÑоÑоÑипом Ð²Ð½Ð¾Ð²Ñ Ñозданного обÑекÑа.
propertiesObject
ÐеобÑзаÑелÑнÑй паÑамеÑÑ. ÐÑли Ñказан и не Ñавен undefined
, должен бÑÑÑ Ð¾Ð±ÑекÑом, ÑÑи ÑобÑÑвеннÑе пеÑеÑиÑлÑемÑе ÑвойÑÑва (Ñо еÑÑÑ Ñакие, коÑоÑÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½Ð° Ñамом обÑекÑе, а не ÑнаÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ñ Ð¿Ð¾ ÑепоÑке пÑоÑоÑипов) ÑказÑваÑÑ Ð´ÐµÑкÑипÑоÑÑ ÑвойÑÑв, добавлÑемÑÑ
в новÑй обÑекÑ. Ðмена добавлÑемÑÑ
ÑвойÑÑв ÑовпадаÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑвойÑÑв в ÑÑом обÑекÑе. ÐÑи ÑвойÑÑва ÑооÑвеÑÑÑвÑÑÑ Ð²ÑоÑÐ¾Ð¼Ñ Ð°ÑгÑменÑÑ Ð¼ÐµÑода Object.defineProperties()
.
ÐовÑй обÑÐµÐºÑ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пÑоÑоÑипом и ÑвойÑÑвами
ÐÑбÑаÑÑваемÑе иÑклÑÑениÑÐÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение TypeError
, еÑли паÑамеÑÑ proto
не ÑвлÑеÑÑÑ null
или обÑекÑом (иÑклÑÑение ÑоÑÑавлÑÑÑ Ð¾Ð±ÑекÑÑ-обÑÑÑки пÑимиÑивнÑÑ
Ñипов).
Object.create()
Ðиже показан пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Object.create()
Ð´Ð»Ñ Ð¸Ð¼Ð¸ÑаÑии клаÑÑиÑеÑкого наÑледованиÑ. ÐÑо пÑÐ¸Ð¼ÐµÑ Ð¾Ð´Ð¸Ð½Ð¾Ñного наÑледованиÑ, поÑколÑÐºÑ ÑолÑко его поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ JavaScript.
// Shape â ÑÑпеÑклаÑÑ
function Shape() {
this.x = 0;
this.y = 0;
}
// меÑод ÑÑпеÑклаÑÑа
Shape.prototype.move = function (x, y) {
this.x += x;
this.y += y;
console.info("ФигÑÑа пеÑемеÑÑилаÑÑ.");
};
// Rectangle â подклаÑÑ
function Rectangle() {
Shape.call(this); // вÑзÑваем конÑÑÑÑкÑÐ¾Ñ ÑÑпеÑклаÑÑа
}
// подклаÑÑ ÑаÑÑиÑÑÐµÑ ÑÑпеÑклаÑÑ
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log(
"ЯвлÑеÑÑÑ Ð»Ð¸ rect ÑкземплÑÑом Rectangle? " + (rect instanceof Rectangle),
); // true
console.log("ЯвлÑеÑÑÑ Ð»Ð¸ rect ÑкземплÑÑом Shape? " + (rect instanceof Shape)); // true
rect.move(1, 1); // вÑÐ²ÐµÐ´ÐµÑ 'ФигÑÑа пеÑемеÑÑилаÑÑ.'
ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе наÑледоваÑÑÑÑ Ð¾Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ð¾Ð±ÑекÑов, Ñо ÑÑо возможно ÑделаÑÑ Ð¿Ñи помоÑи пÑимеÑей.
function MyClass() {
SuperClass.call(this);
OtherSuperClass.call(this);
}
MyClass.prototype = Object.create(SuperClass.prototype); // наÑледование
mixin(MyClass.prototype, OtherSuperClass.prototype); // пÑимеÑивание
MyClass.prototype.myMethod = function () {
// ÑÑо-Ñо делаем
};
ФÑнкÑÐ¸Ñ Ð¿ÑимеÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° копиÑоваÑÑ ÑÑнкÑии из пÑоÑоÑипа ÑÑпеÑклаÑÑа в пÑоÑоÑип подклаÑÑа, она должна пÑедоÑÑавлÑÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем. ÐÑимеÑом пÑимеÑи Ð¼Ð¾Ð¶ÐµÑ ÑлÑжиÑÑ ÑÑнкÑÐ¸Ñ jQuery.extend().
ÐÑимеÑ: иÑполÑзование аÑгÑменÑаpropertiesObject
Ñ Object.create()
var o;
// ÑоздаÑм обÑÐµÐºÑ Ñ Ð½ÑлевÑм пÑоÑоÑипом
o = Object.create(null);
o = {};
// ÑквиваленÑно ÑÑомÑ:
o = Object.create(Object.prototype);
// Ð ÑÑом пÑимеÑе Ð¼Ñ ÑоздаÑм обÑÐµÐºÑ Ñ Ð½ÐµÑколÑкими ÑвойÑÑвами.
// (ÐбÑаÑиÑе внимание, ÑÑо вÑоÑой паÑамеÑÑ Ð¾ÑобÑÐ°Ð¶Ð°ÐµÑ ÐºÐ»ÑÑи на *деÑкÑипÑоÑÑ ÑвойÑÑв*.)
o = Object.create(Object.prototype, {
// foo ÑвлÑеÑÑÑ ÑÑдовÑм 'ÑвойÑÑвом-знаÑением'
foo: { writable: true, configurable: true, value: "пÑивеÑ" },
// bar ÑвлÑеÑÑÑ ÑвойÑÑвом Ñ Ð³ÐµÑÑеÑом и ÑеÑÑеÑом (ÑвойÑÑвом доÑÑÑпа)
bar: {
configurable: false,
get: function () {
return 10;
},
set: function (value) {
console.log("УÑÑановка `o.bar` в", value);
},
/* пÑи иÑполÑзовании меÑодов доÑÑÑпа ES5 Ð½Ð°Ñ ÐºÐ¾Ð´ мог Ð±Ñ Ð²ÑглÑдеÑÑ Ñак:
get function() { return 10; },
set function(value) { console.log('УÑÑановка `o.bar` в', value); } */
},
});
function Constructor() {}
o = new Constructor();
// ÑквиваленÑно ÑÑомÑ:
o = Object.create(Constructor.prototype);
// ÐонеÑно, еÑли Ð±Ñ Ð² ÑÑнкÑии Constructor бÑл Ð±Ñ ÑеалÑнÑй код иниÑиализаÑии,
// меÑод Ñ Object.create() не бÑл Ð±Ñ ÑквиваленÑнÑм
// ÑоздаÑм новÑй обÑекÑ, Ñей пÑоÑоÑип ÑвлÑеÑÑÑ Ð½Ð¾Ð²Ñм пÑÑÑÑм обÑекÑом
// и добавлÑем пÑоÑÑое ÑвойÑÑво 'p' Ñо знаÑением 42
o = Object.create({}, { p: { value: 42 } });
// по ÑмолÑÐ°Ð½Ð¸Ñ ÑвойÑÑва ÐРЯÐÐЯЮТСЯ запиÑÑваемÑми, пеÑеÑиÑлÑемÑми или наÑÑÑаиваемÑми:
o.p = 24;
o.p;
// 42
o.q = 12;
for (var prop in o) {
console.log(prop);
}
// 'q'
delete o.p;
// false
// Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑвойÑÑва ES3
o2 = Object.create(
{},
{
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true,
},
},
);
ÐолиÑил
ÐÐ»Ñ ÑÑого полиÑила Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° пÑавилÑно ÑабоÑаÑÑÐ°Ñ Object.prototype.hasOwnProperty.
if (typeof Object.create != "function") {
// ÐÑÐ°Ð¿Ñ Ð¿ÑоизводÑÑва ECMA-262, издание 5, 15.2.3.5
// СÑÑлка: http://es5.github.io/#x15.2.3.5
Object.create = (function () {
// ЧÑÐ¾Ð±Ñ ÑÑкономиÑÑ Ð¿Ð°Ð¼ÑÑÑ, иÑполÑзÑйÑе обÑий конÑÑÑÑкÑоÑ
function Temp() {}
// Ð´ÐµÐ»Ð°ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° Object.prototype.hasOwnProperty
var hasOwn = Object.prototype.hasOwnProperty;
return function (O) {
// 1. ÐÑли Type(O) не ÑвлÑеÑÑÑ Object or Null вÑдаÑÑÑÑ Ð¸ÑклÑÑение TypeError.
if (typeof O != "object") {
throw TypeError("Object prototype may only be an Object or null");
}
// 2. ÐÑÑÑÑ obj бÑÐ´ÐµÑ ÑезÑлÑÑаÑом ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа, как еÑли бÑ
// вÑÑажение new Object(), где Object ÑвлÑеÑÑÑ ÑÑандаÑÑнÑм вÑÑÑоеннÑм
// конÑÑÑÑкÑоÑом Ñ Ñаким именем
// 3. УÑÑановиÑе Ð´Ð»Ñ Ð²Ð½ÑÑÑеннего ÑвойÑÑва [[Prototype]] обÑекÑа obj знаÑение O.
Temp.prototype = O;
var obj = new Temp();
Temp.prototype = null; // ÐавайÑе не бÑдем деÑжаÑÑ ÑлÑÑайнÑе ÑÑÑлки на Ð...
// 4. ÐÑли аÑгÑÐ¼ÐµÐ½Ñ Properties пÑиÑÑÑÑÑвÑÐµÑ Ð¸ не опÑеделÑн, добавлÑем
// ÑобÑÑвеннÑе ÑвойÑÑва к obj, как бÑдÑо вÑзÑÐ²Ð°Ñ ÑÑандаÑÑнÑÑ Ð²ÑÑÑоеннÑÑ
// ÑÑнкÑÐ¸Ñ Object.defineProperties Ñ Ð°ÑгÑменÑами obj и
// Properties.
if (arguments.length > 1) {
// Object.defineProperties Ð´ÐµÐ»Ð°ÐµÑ ToObject Ñвоим пеÑвÑм аÑгÑменÑом.
var Properties = Object(arguments[1]);
for (var prop in Properties) {
if (hasOwn.call(Properties, prop)) {
obj[prop] = Properties[prop];
}
}
}
// 5. ÐозвÑаÑÐ°ÐµÑ obj
return obj;
};
})();
}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
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