Javascript 为什么';这';和';原型&x27;在构造函数和实例上表现不同?
我试图理解为什么构造函数和新实例的行为有所不同。在以下代码中,airpair.range返回未定义。我不明白为什么它不像新实例那样返回2000Javascript 为什么';这';和';原型&x27;在构造函数和实例上表现不同?,javascript,constructor,this,prototype,Javascript,Constructor,This,Prototype,我试图理解为什么构造函数和新实例的行为有所不同。在以下代码中,airpair.range返回未定义。我不明白为什么它不像新实例那样返回2000 功能飞机(){ 这个距离='2000公里'; } 让野马=新飞机(); 控制台日志('Aircraft.range',Aircraft.range); 控制台日志('mustang.range',mustang.range)以下是对这三种情况的简单解释: this.range表示range仅是所创建实例的属性 Aircraft.prototype.r
功能飞机(){
这个距离='2000公里';
}
让野马=新飞机();
控制台日志('Aircraft.range',Aircraft.range);
控制台日志('mustang.range',mustang.range)代码>以下是对这三种情况的简单解释:
this.range
表示range
仅是所创建实例的属性
Aircraft.prototype.range
意味着range
是您将创建的所有实例的属性,因为它是在构造函数的prototype中定义的
airpair.range
表示range
是构造函数的属性(因为函数是对象),与实例无关。实例只能通过使用this.constructor.range
访问该属性
真正帮助我理解这一点的是准确理解
新的
关键字的作用
新飞机
指:
创建一个对象(“{}
”)
调用飞机
功能,对象为此
(将该对象上的范围
设置为“2000公里”
将该对象的原型设置为飞机。原型
您可以像这样自己实现它:
function _new ( constructor ) {
var instance = {};
constructor.call( instance );
instance.prototype = constructor.prototype;
return instance;
}
\u new(airpair)
大致相当于new airpair()
我真的不知道为什么你会期望它们的行为相同,实例和构造函数是完全不同的东西。别开玩笑了。它们是不同的?现在一切都清楚了。是的,它们是不同的。如果你说x.size=function(){}
然后问为什么y.size
没有定义,这和你问的问题是一样的。可能的重复项看起来是一样的,因为你使用了标量。考虑:function Foo(){this.notShared={a:1};Foo.prototype.shared={b:2};var Foo=new Foo();var bar=new Foo();bar.shared.b=3;console.log(foo.shared.b);//3!!
。每个实例的notShared
可以安全地进行变异,但是如果原型上有一个可变对象,那么所有实例都指向同一个对象。好吧,有趣的是,我可以这样做。但是在任何情况下range
都不是构造函数的属性?也不要定义airpair.range
(哎呀,编辑解释道)-如果你想airpair.range
成为“某物”,你必须将airpair.range
设置为“某物”@很好,这很有意义!谢谢你解释了所有三个例子。如果不比较所有三个例子,我是不会理解的。谢谢!这听起来可能很简单,但知道new
意味着创建{}
确实有助于在我的大脑中巩固这一点。