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]]]
混在一起了。谢谢你的链接,非常有用!