题
从 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的)允许访问[[原型]]属性直接...