http://www.jibbering.com/faq/faq_notes/closures.html :

注:写定义内[[原型]]财产的内部目的类型。这酒店是不是直接的脚本,但是它的对象链称与内部[[原型]]财产中使用的财产取决议;的对象的原型链。一个原型公共财产的存在允许转让、定义和操纵的原型在协会内部的[[原型]]的财产。 的细节之间的关系,描述了两个在通信机制详解262(第3版)的范围之外的这种讨论。

什么细节之间的关系的两个?我已经通过浏览通信机制详解262和所有我读过有这样的东西:

构造的关的原型,可以引用的程序表达的构造。原型,

母写的对象有一个内部财产称为[[原型]].这酒店是null或对象和用于实施继承权。

每一个建立在功能和每一内置的构造所具有的功能原型的对象,这是最初的价值表达的功能。原型

每个内置原型的对象对象的原型,目的,其初始价值的表达 对象。原型(15.3.2.1),作为价值的其内部的[[原型]]财产,除的对象 原型,目的本身。

从这个我收集的是,该[[原型]]的财产相当于 prototype 酒店几乎任何物体。是我错了?

有帮助吗?

解决方案

我相信你是正确的在大多数情况下。

每个对象具有隐蔽[[Prototype]]属性,该属性被用于继承。功能附加地有一个公共prototype属性,当函数被用作构造,其仅用于:当一个对象被使用new构造新对象的[[Prototype]]属性被设置为的是使用作为构造函数的prototype属性。

E.g。

function C() {}
C.prototype = P1;  
var obj = new C();  // obj.[[Prototype]] is now P1.

您可以使用[[Prototype]]得到Object.getPrototypeOf(<obj>)财产。 (ECMAScript中指定该方法5. JavaScript的旧版本不具有读取[[Prototype]]的任何标准方式)。

您可以一般的得到通过构造,e.g原型:

obj.constructor.prototype == Object.getPrototypeOf(obj) 

但是,这并非总是如此,因为构造函数的原型属性可以被重新分配,但是在创建对象后的对象的[[Prototype]]不能被重新分配。所以,如果你做的:

C.prototype = P2;

然后

obj.constructor.prototype != Object.getPrototypeOf(obj)

由于C的原型现在是P2,但[[Prototype]]obj仍然P1

请注意,这是具有一个prototype属性功能。还需要注意的是函数的prototype属性是不一样的功能[[Prototype]]财产!

其他提示

来回答你的问题直接:逻辑上它是一种目的的私人复制的 prototype 酒店其构造。使用这元语言是如何对象的创建:

// not real JS

var Ctr = function(...){...};
Ctr.prototype = {...}; // some object with methods and properties

// the object creation sequence: var x = new Ctr(a, b, c);
var x = {};
x["[[prototype]]"] = Ctr.prototype;
var result = Ctr.call(x, a, b, c);
if(typeof result == "object"){ x = result; }
// our x is fully constructed and initialized at this point

在这一点上,我们可以修改原型,并改变将反映通过的所有类的对象,因为它们指原型通过参考:

Ctr.prototype.log = function(){ console.log("...logging..."); };

x.log();  // ...logging..

但是,如果我们改变原型的构造,已经创建的对象将继续参照旧的对象:

Ctr.prototype = {life: 42};
// let's assume that the old prototype didn't define "life"

console.log(x.life);  // undefined
x.log();              // ...logging...

在完全按照标准 [[prototype]] 是不是可用的,但Mozilla延伸的标准 __proto__ 酒店(read-only),这是暴露通常隐藏 [[prototype]]:

再次, __proto__ 可以在合法化 下一ES3.标准1.

在除了olavk的回答:某些JavaScript实现(例如 Mozilla的)允许访问[[原型]]属性直接...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top