Как получить доступ к прототипу объекта в JavaScript?
во всех статьях написано, что JavaScript является языком, основанным на прототипе, что означает, что каждый объект имеет прототип (или, точнее, цепочку прототипов).
до сих пор я попробовал следующий фрагмент кода:
var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
как я могу получить доступ к объекту прототипа object1
? Есть ли нейтральный для браузера способ сделать это (я имею в виду, не полагаясь на __proto__
собственность? Видел этой ссылка, но может есть новые разработки с 2010 года), если я не могу, не могли бы вы поделиться, пожалуйста, обоснованием капюшона?
4 ответов
var f = function();
var instance = new f();
если вы знаете имя instance
функции класса, вы можете просто получить доступ к прототипу, как:
var prototype = f.prototype;
prototype.someMember = someValue;
если вы не:
1)
var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;
2) или
var prototype = instance.__proto__;
prototype.someMember = someValue;
3) или
var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;
для совместимости вы можете поместить в свой код следующий фрагмент (и использовать всегда Object.getPrototypeOf(instance)
вернуться prototype):
if(!Object.getPrototypeOf) {
if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {
Object.getPrototypeOf = function getPrototypeOf(object) {
return object.__proto__;
};
} else {
Object.getPrototypeOf = function getPrototypeOf(object) {
// May break if the constructor has been changed or removed
return object.constructor ? object.constructor.prototype : void 0;
};
}
}
обновление:
согласно ECMA-262 6th Edition (июнь 2015) __proto__
свойство стандартизировано как дополнительная функция для веб-браузеров. Все последние версии лучших браузеров поддерживают его сейчас. Подробнее о __proto__
:
EDMA-262 6th Edition (июнь 2015):
B.2.2.1 Object.prototype.__proto__
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
похоже
Object.getPrototypeOf(passedObject);
будет работать для этого, и совместим с современными браузерами.
var F = function();
F.prototype.member1 = 1;
F.prototype.getClass = F;
var object1 = new F();
object1.member1 = 2;
console.log(object1.getClass.prototype.member1); // prints 1
console.log(object1.member1); // prints 2