Javascript 原型和对象创建
最近我试图了解原型链的技术方面。现在我有几个关于对象实例化的问题 考虑以下代码:Javascript 原型和对象创建,javascript,inheritance,object,prototype-programming,Javascript,Inheritance,Object,Prototype Programming,最近我试图了解原型链的技术方面。现在我有几个关于对象实例化的问题 考虑以下代码: var Foo = function(s) { this._bar = s; }; var fooInst = new Foo('test'); 现在,当我检查创建的对象时,然后: Foo.prototype === Function.prototype; // true fooInst.prototype === ? fooInst.prototype.prototype === Object.prot
var Foo = function(s) {
this._bar = s;
};
var fooInst = new Foo('test');
现在,当我检查创建的对象时,然后:
Foo.prototype === Function.prototype; // true
fooInst.prototype === ?
fooInst.prototype.prototype === Object.prototype; // true
我想知道,fooInst.prototype到底是什么。在Chromes inspector中,它似乎是某种Foo
,具有构造函数
属性。但是我读到的所有关于原型的资料都表明fooInst.prototype===Foo.prototype
应该是真的
所以我的问题是:JS到底是如何处理原型链的。当我调用newfoo
时会发生什么
提前谢谢
编辑
所以我发现,(在Chrome中)Object.getPrototypeOf(fooInst)==Foo.prototype为true
,但Object.getPrototypeOf(fooInst)==Object.getPrototypeOf(Foo)
为false
。为什么
我想知道fooInst.原型到底是什么
它是未定义的
fooInst.prototype === undefined; // true
只有函数具有自动.prototype
属性。对象不会
如果使用构造函数创建对象,如:
var fooInst = new Foo('test');
…然后fooInst
将有一个对Foo.prototype
的内部引用,但是没有标准属性可从fooInst
获取Foo.prototype
也就是说,有些JavaScript环境支持非标准属性来引用原型对象
fooInst.__proto__ === Foo.prototype; // true (if __proto__ supported)
另外,ECMAScript 5提供了一个方法,可以使用它
Object.getPrototypeOf( fooInst ) === Foo.prototype; // true
从一个对象到其原型对象的内部引用可能只是此类引用链中的第一个引用 prototype对象可能有自己的被引用的prototype对象。(在基本情况下,这将是
Object.prototype
,或者对于较长的链,Object.prototype
可能位于链的下游。)
Object.prototype
本身引用null
作为其原型。这就结束了链条
您应该注意,如果更改构造函数的.prototype
对象,则从对象到其原型对象的内部引用不会更改。它是为对象的生命周期而存在的引用
var Foo = function(s) {
this._bar = s;
};
var fooInst = new Foo('test');
Object.getPrototypeOf( fooInst ) === Foo.prototype; // true
// Change the prototype object of Foo
Foo.prototype = { some:'object' };
Object.getPrototypeOf( fooInst ) === Foo.prototype; // false
您的第一个假设:
Foo.prototype === Function.prototype;
是不对的,我认为您混淆了所有对象都具有的[[Prototype]]
内部属性的概念,并使原型链的“链接”与函数对象具有的Prototype
属性
上述比较将产生false
,因为Foo.prototype
属性的值是在创建Foo
函数时创建的新对象
无论何时创建函数对象,该对象都会初始化,它继承自object.prototype
,并且它有一个名为constructor
的属性,该属性指向函数(Foo.prototype.constructor==Foo
),当您将函数作为构造函数调用时使用
现在,如果我们谈论[[Prototype]]
内部属性,您是对的,Foo
函数的[[Prototype]]
是函数。Prototype
换句话说,Foo
继承自函数。Prototype
,例如:
Object.getPrototypeOf(Foo) === Function.prototype; // true
Foo instanceof Function; // true
Foo.__proto__ === Function.prototype; // true
关于fooInst
此对象是在一个新表达式中创建的,当您将Foo
函数用作构造函数时,会生成此新对象,它继承自Foo.prototype
,(其内部[[prototype]]
属性指向Foo.prototype
)
它没有prototype
属性,因为该属性仅对函数对象有意义
另见:
fooInst
有一个原型链,其头部是Foo.prototype
。调用new Foo
时,创建了一个对象,Foo.prototype
被设置为其原型链,并在新对象的上下文中调用构造函数
某些浏览器将其公开为非标准的\uuuuu proto\uuuu
属性,例如:
fooInst.__proto__ === Foo.prototype
Foo
是一个函数,fooInst
是一个Foo
。但是我假设,任何对象都有一个原型对象?和Object.getPrototypeOf(fooInst)
给出Foo.prototype
@mAu:是的,请参阅我的更新。我引用了标准的.getPrototypeOf()
方法和非标准的\uuuuuuuuuuuuuuuuuuuu
属性。如果使用object.create()
创建对象,实际上可以将原型设置为null
,而不是对象var o=Object.create(空)代码>感谢您的澄清!也谢谢你,你说得对,我把两个原型
和[[prototype]]]
混在一起了。谢谢你的链接,非常有用!