Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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中对构造函数设置原型时的有趣行为_Javascript_Constructor_Prototype Programming - Fatal编程技术网

在javaScript中对构造函数设置原型时的有趣行为

在javaScript中对构造函数设置原型时的有趣行为,javascript,constructor,prototype-programming,Javascript,Constructor,Prototype Programming,从一个简单的尝试开始,我定义了一个构造函数并使用它创建了一个实例myobject: function MyConstructor () {}; var myobject = new MyConstructor (); 然后,我修改了这个构造函数的prototype属性,并用它创建了另一个实例myobject1: MyConstructor.prototype = {}; var myobject1 = new MyConstructor (); 我重复了相同的过程并创建了另一个实例myobj

从一个简单的尝试开始,我定义了一个构造函数并使用它创建了一个实例
myobject

function MyConstructor () {};
var myobject = new MyConstructor ();
然后,我修改了这个构造函数的
prototype
属性,并用它创建了另一个实例
myobject1

MyConstructor.prototype = {};
var myobject1 = new MyConstructor ();
我重复了相同的过程并创建了另一个实例
myobject2

MyConstructor.prototype = {name: '2'};
var myobject2 = new MyConstructor ();
现在,我正在测试每个实例的
构造函数
属性,这不是我所期望的:

myobject.constructor == MyConstructor;
//true
myobject1.constructor == MyConstructor;
//false
myobject2.constructor == MyConstructor;
//false
在查找[[prototype]]时,它彼此不同

myobject.__proto__ == myobject1.__proto__
//false
myobject2.__proto__ == myobject1.__proto__
//false

有人能解释一下当更改MyConstructor的
原型属性时,MyConstructor会发生什么情况吗?

当您创建构造函数时:

函数MyConstructor(){};
它已将prototype.constructor设置为MyConstructor:

MyConstructor.prototype.constructor===MyConstructor//符合事实的
当您通过

MyConstructor.prototype={foo:function(){};
然后,Original MyConstructor.prototype对象被传递的对象{foo:function(){}替换,并且此对象的属性“constructor”未设置为MyConstructor,而是设置为function对象,因为对象是绑定到由对象文字创建的所有对象的构造函数

因此,在此之后:

MyConstructor.prototype = { foo: function () {} };
MyConstructor.prototype.constructor === Object;
当您使用此构造函数创建新对象时

var foo=newmyconstructor();
然后:

foo.constructor==Object;//符合事实的
因此,要修复此问题,在覆盖prototype之后,必须更正构造函数字段:

MyConstructor.prototype={foo:function(){};
MyConstructor.prototype.constructor=MyConstructor;
然后,您的构造函数就有了具有正确构造函数字段的原型。 你也可以写:

MyConstructor.prototype={foo:function(){},构造函数:MyConstructor};

最终的效果将是一样的。

建造师被保存在原型中。通过使用{}销毁原型,可以有效地删除对构造函数的任何引用