Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.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 为什么';这';和';原型&x27;在构造函数和实例上表现不同?_Javascript_Constructor_This_Prototype - Fatal编程技术网

Javascript 为什么';这';和';原型&x27;在构造函数和实例上表现不同?

Javascript 为什么';这';和';原型&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

我试图理解为什么构造函数和新实例的行为有所不同。在以下代码中,airpair.range返回未定义。我不明白为什么它不像新实例那样返回2000

功能飞机(){
这个距离='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
      意味着创建
      {}
      确实有助于在我的大脑中巩固这一点。