Javascript 为什么在JS中不能在原型上设置非函数
我不知道如何表达标题,但这里有一个例子让我大吃一惊Javascript 为什么在JS中不能在原型上设置非函数,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我不知道如何表达标题,但这里有一个例子让我大吃一惊 myLib.prototype._handlers = {}; myLib.prototype.destroy = function () { this._handlers = {}; } 我正在编写测试,幸运的是它发现了这个问题。这种销毁方法实际上不起作用 为什么会发生这种情况?我认为原型上的属性是为每个新myLib实例创建的,但是通过编写这些测试,所有新myLib实例都有这些处理程序。您可以在原型上设置非函数。问题是原型上的属性在对象
myLib.prototype._handlers = {};
myLib.prototype.destroy = function () {
this._handlers = {};
}
我正在编写测试,幸运的是它发现了这个问题。这种销毁方法实际上不起作用
为什么会发生这种情况?我认为原型上的属性是为每个
新myLib
实例创建的,但是通过编写这些测试,所有新myLib
实例都有这些处理程序。您可以在原型上设置非函数。问题是原型上的属性在对象的所有实例中共享。这通常不是您想要的数据属性,而是您想要的函数属性
因此,您通常在对象的构造函数中初始化数据属性,这使它们“拥有”属性,这些属性对于每个实例都是唯一的,这通常是您想要的
我认为原型上的属性是为每个对象创建的新属性 新的myLib实例,但是从编写这些测试开始,所有的myLib都是新的 实例具有这些处理程序 原型是用作属性查找机制的对象。当引用
var x=obj.prop
时,Javascript首先查看obj
对象本身,查看是否有名为“prop”
的属性。如果存在,则将其视为“自有”属性,并获取其值。如果没有,则转到prototype对象,查看它是否具有名为“prop”
的“own”属性。如果是,则返回该值。如果它没有那个命名属性,那么它会检查prototype对象是否有自己的原型,如果有,它会检查这个原型,依此类推
因此,原型用作查找参考。不会复制或创建任何新内容。只有一个原型的“参考”可用于查找。这就是原型在所有实例之间共享的原因。它是故意这样设计的,原因有很多。一个原因是它的存储效率高。只有一个原型对象是所有实例共享的,因此所有这些引用不必在每个对象实例上重复
当您指定给具有以下属性的属性时:
obj.someProp = "foo";
它只会影响“自有”财产。它不会影响原型。如果名为“someProp”
的对象上有一个“own”属性,则其值将更新。如果没有,则在实际对象实例上创建一个新的“own”属性。如果原型上有一个同名的属性,那么这个值现在基本上是隐藏的,因为Javascript属性查找方案将首先找到“own”属性,并从那时起使用它(只要它存在)
在
.destroy()
方法中指定属性时,了解以下内容也很重要:
myLib.prototype._handlers = {};
myLib.prototype.destroy = function () {
this._handlers = {};
}
当您执行
obj.destroy()
方法时,这实际上根本不会触及myLib.prototype.\u handlers
值。相反,this.\u handlers={}代码>在对象的实际实例上创建一个新属性,即“own”属性。任何对的引用都会首先找到“own”属性,这就是从那时起将使用的属性,因此它可能“似乎”改变了原型值,但新的“own”属性只是从那时起屏蔽原型值。您可以在原型上设置非函数。问题是原型上的属性在对象的所有实例中共享。这通常不是您想要的数据属性,而是您想要的函数属性
因此,您通常在对象的构造函数中初始化数据属性,这使它们“拥有”属性,这些属性对于每个实例都是唯一的,这通常是您想要的
我认为原型上的属性是为每个对象创建的新属性
新的myLib实例,但是从编写这些测试开始,所有的myLib都是新的
实例具有这些处理程序
原型是用作属性查找机制的对象。当引用var x=obj.prop
时,Javascript首先查看obj
对象本身,查看是否有名为“prop”
的属性。如果存在,则将其视为“自有”属性,并获取其值。如果没有,则转到prototype对象,查看它是否具有名为“prop”
的“own”属性。如果是,则返回该值。如果它没有那个命名属性,那么它会检查prototype对象是否有自己的原型,如果有,它会检查这个原型,依此类推
因此,原型用作查找参考。不会复制或创建任何新内容。只有一个原型的“参考”可用于查找。这就是原型在所有实例之间共享的原因。它是故意这样设计的,原因有很多。一个原因是它的存储效率高。只有一个原型对象是所有实例共享的,因此所有这些引用不必在每个对象实例上重复
当您指定给具有以下属性的属性时:
obj.someProp = "foo";
它只会影响“自有”财产。它不会影响原型。如果名为“someProp”
的对象上有一个“own”属性,则其值将更新。如果没有,则在实际对象实例上创建一个新的“own”属性。如果原型上有一个同名的属性,那么这个值现在基本上是隐藏的,因为Javascript属性查找方案将首先找到“own”属性,并从那时起使用它(只要它存在)
在.destroy()
方法中指定属性时,了解以下内容也很重要:
myLib.prototype._handlers = {};
myLib.prototype.destroy = function () {
this._handlers = {};
}
当您执行obj.destroy()
方法时,这实际上根本不会触及myLib.prototype.\u handlers
值。相反,这个