Bre*_*eak 59 javascript prototype prototypal-inheritance
在所有文章中都写道,JavaScript是一种基于原型的语言,这意味着每个对象都有一个原型(或更确切地说,原型链).
到目前为止,我已经尝试了以下代码片段:
var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能访问原型对象object1
?有没有以浏览器为中心的方式(我的意思是,不依赖于__proto__
财产?看到这个链接,但也许自2010年以来有新的发展)如果我不能,你能分享一下引擎背后的理由吗?
And*_* D. 107
var f = function();
var instance = new f();
Run Code Online (Sandbox Code Playgroud)
如果你知道instance
类函数的名称,你可以简单地访问原型:
var prototype = f.prototype;
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)
如果你不这样做:
1)
var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)
2)或
var prototype = instance.__proto__;
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)
3)或
var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)
为了兼容性,您可以在代码中放入以下代码段(并始终使用Object.getPrototypeOf(instance)
返回原型):
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;
};
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
根据ECMA-262第6版(2015年6月),__proto__
属性被标准化为Web浏览器的附加功能.所有最新版本的顶级浏览器现在都支持它.了解更多__proto__
:
EDMA-262第6版(2015年6月): B.2.2.1 Object.prototype.__proto__
小智 5
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67348 次 |
最近记录: |