Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在JS中不能在原型上设置非函数_Javascript_Prototypal Inheritance - Fatal编程技术网

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
值。相反,
这个