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

时间:2018-03-31 00:25:13

标签: javascript constructor this prototype

我试图理解为什么thisprototype在构造函数与新实例中的行为不同。在下面的代码中,Aircraft.range返回undefined。我无法理解为什么它不像新实例那样返回2,000。



function Aircraft() {
    this.range = '2,000 Km';
}

let mustang = new Aircraft();

console.log('Aircraft.range ', Aircraft.range);
console.log('mustang.range ', mustang.range);




使用原型的这种尝试产生了相同的结果。



function Aircraft() {}

Aircraft.prototype.range = '2,000 Km';

let mustang = new Aircraft();

console.log(Aircraft.range);
console.log(mustang.range);




****更新****

我读过很多关于原型和实例的文章,但理论只是到目前为止。这是一个特定的问题,用于解决这些想法的机制。我收到的答案比十几篇谈论理论的文章更能理解这个概念。我确信这些答案可以帮助其他人尝试学习Javascript的基础知识。

2 个答案:

答案 0 :(得分:3)

以下是对这三种情况的简单解释:

  • range表示Aircraft.prototype.range仅是所创建实例的属性。
  • range表示Aircraft.range是您创建的所有实例的属性,因为它是在构造函数的原型中定义的。
  • range表示this.constructor.range是构造函数的属性(因为函数是对象)并且与实例无关。实例只能使用10.0.2.2:3000
  • 访问该属性

答案 1 :(得分:1)

真正帮助我理解这一点的是确切了解new关键字的作用。

new Aircraft表示:

  1. 创建一个对象(" {}")
  2. 使用Aircraft对象调用this函数(将该对象设置为.range"2,000 Km"
  3. 将该对象的原型设置为Aircraft.prototype
  4. 你可以这样自己实现:

    function _new ( constructor ) {
        var instance = {};
        constructor.call( instance );
        instance.prototype = constructor.prototype;
        return instance;
    }
    

    _new( Aircraft )大致相当于new Aircraft()