原型和对象创建

mAu*_*mAu 3 javascript inheritance object prototype-programming

最近我试图获得原型链的技术方面.现在我有一些关于对象实例化的问题.

请考虑以下代码:

var Foo = function(s) {
  this._bar = s;
};

var fooInst = new Foo('test');
Run Code Online (Sandbox Code Playgroud)

现在当我检查创建的对象时,然后:

Foo.prototype === Function.prototype; // true

fooInst.prototype === ?
fooInst.prototype.prototype === Object.prototype; // true
Run Code Online (Sandbox Code Playgroud)

我想知道,fooInst.prototype到底是什么.在铬合金检查它似乎是某种Fooconstructor性能.但是我读到的关于原型的所有资料都说明fooInst.prototype === Foo.prototype应该是真的.

所以我的问题是:JS如何处理原型链.我打电话到底发生了什么new Foo.

提前致谢!

编辑

于是我发现,(在Chrome)Object.getPrototypeOf(fooInst) === Foo.prototype;true,但Object.getPrototypeOf(fooInst) === Object.getPrototypeOf(Foo)false.为什么?

use*_*716 6

我想知道,fooInst.prototype到底是什么.

是的undefined.

fooInst.prototype === undefined; // true
Run Code Online (Sandbox Code Playgroud)

只有函数具有自动.prototype属性.物体没有.

如果使用构造函数创建对象,例如:

var fooInst = new Foo('test');
Run Code Online (Sandbox Code Playgroud)

......那么fooInst将有一个内部参考Foo.prototype,但没有标准的属性来获取Foo.prototypefooInst.


也就是说,在某些 JavaScript环境中支持非标准属性来引用原型对象.

fooInst.__proto__ === Foo.prototype; // true (if __proto__ supported)
Run Code Online (Sandbox Code Playgroud)

此外,ECMAScript 5提供了一种可以使用的方法.

Object.getPrototypeOf( fooInst ) === Foo.prototype;  // true
Run Code Online (Sandbox Code Playgroud)

从对象到其原型对象的内部引用可能只是这类引用链中的第一个引用.

原型对象可能有自己的原型对象被引用.(在基本情况下,这将是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
Run Code Online (Sandbox Code Playgroud)