nah*_*elm 5 javascript prototype
我很擅长使用object.create而不是经典的js方式来实现原型继承.
至少在Chrome中,我很惊讶地看到以下代码:
var baseObject = {
test : function(){
console.log('Child');
}
}
var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);
newObject.test();
Run Code Online (Sandbox Code Playgroud)
生成这个(模拟Web工具中的输出):
Object {test: function, test: function}
test: function (){
__proto__: Object
test: function (){
__proto__: Object
Parent
Child
Run Code Online (Sandbox Code Playgroud)
所以你看到它不是设置原型而只是"__proto__",我认为它在使用时不鼓励.您可以看到,在我的代码中,我能够正确地继承并调用父对象,但只能使用"__proto__".使用"原型"会导致错误(未定义).
这里发生了什么?我认为object.create会设置"原型",因为这是标准(或者我假设).为什么要填充并让我使用"__proto__"
不__proto__鼓励不使用设置原型继承,因为它是非标准的.这并不意味着您不能使用Object.create()特定原型对象创建新对象.
.prototype默认情况下,对象没有属性.你混淆了.prototype一个函数的对象.
所以,如果我有这样的功能:
function Foo() {
}
Run Code Online (Sandbox Code Playgroud)
该Foo函数对象具有一个.prototype属性,该属性引用一个对象,该对象将用作__proto__在作为构造函数调用时创建的任何对象.
var f = new Foo();
Run Code Online (Sandbox Code Playgroud)
所以现在f是Foo.prototype其原型链中的一个对象.您可以使用Object.getPrototypeOf();
Object.getPrototypeOf(f) === Foo.prototype; // true
Run Code Online (Sandbox Code Playgroud)
是什么Object.create给你是要建立相同的原型链,但不使用构造函数的能力.所以这是等价的.
var f2 = Object.create(Foo.prototype);
Run Code Online (Sandbox Code Playgroud)
现在我们有一个以与原始f对象相同的方式设置的对象.
Object.getPrototypeOf(f2) === Foo.prototype; // true
Object.getPrototypeOf(f2) === Object.getPrototypeOf(f); // true
Run Code Online (Sandbox Code Playgroud)
所以这只是一种不同的方式来做最终相同的事情.对象与其原型链之间的关系是内部关系.非标准__proto__只是暴露了这种关系.
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |