(易于理解的解释)
prototype
属性仅适用于将
函数
作为构造函数使用(使用
new
运算符)。
function
创建其
prototype
的克隆,函数内部的
this
关键字设置为克隆。克隆上的属性是对
原型
属性的直接引用/指针。
对象文字{}
是new Object()
的更强大的表达式替代方法,并因此“继承”了来自 Object.prototype
的属性。
所以:
function ClassLike() {}
ClassLike.prototype = {
foo : "bar"
}
var instance = new ClassLike();
alert( instance.foo );
这段代码能够工作是因为new
操作符会启动一些操作来创建一个新的对象,而:
var instance = {
foo : "bar"
}
instance.prototype = {
baz : "foobar"
}
仅仅是向已经创建的对象添加另一个属性(原型),并且没有启动任何过程来实际分配/更改对象的原始原型。
现在Mozilla已经添加了一种非标准的(IE不支持)方式,通过__proto__
来更改已经实例化的对象的原型,并且有一些请愿正在进行中,希望将其添加到ES5(EcmaScript 5)中。我目前不会使用它,但它的工作方式如下:
var instance = {};
var parent = {
foo : "bar"
}
instance.__proto__ = parent;
alert( instance.foo );
改变已实例化对象的原型的另一种方法是添加到Object
构造函数的原型中(出于许多原因,不建议这样做)。如下:
var instance = {};
Object.prototype.foo = "bar";
alert( instance.foo );
虽然所有的事情都是可能的,但是否明智去做...我会说不,但意见因人而异,我宁愿避免争论 ;)
无论如何,请记住只有在你使用new
一个function
时,prototype
属性才会起作用,否则它只成为实例上的一个属性。
new B().fn2()
不会起作用,因为没有在任何地方定义B()
函数。 - rsp