JavaScript OOP概念 - 属性

时间:2014-10-31 09:32:49

标签: javascript

在MDN上,他们说明了以下内容:

  

属性是类中包含的变量;每个实例   对象具有这些属性。 应在原型中设置属性   属性类(函数)以便继承正常工作

看看我设置为粗体的部分,我认为这意味着:

myClass.prototype.newProperty = ...

但是他们的例子显示了以下内容:

function Person(firstName) {
  this.firstName = firstName;
  console.log('Person instantiated');
}

var person1 = new Person('Alice');
var person2 = new Person('Bob');

// Show the firstName properties of the objects
console.log('person1 is ' + person1.firstName); // logs "person1 is Alice"
console.log('person2 is ' + person2.firstName); // logs "person2 is Bob"

在他们的示例中,他们正在添加属性" firstName'直接使用'这个'直接到班级/功能。

这是否意味着:
a)函数声明是原型吗?即myClass是原型,它还有一个属性原型,默认情况下设置为Object?
b)使用'这个。'在函数声明中确实将属性添加到myClass.prototype

修改:更新了标题

1 个答案:

答案 0 :(得分:2)

JavaScript 没有类,停止在类中思考,因为这不适用于JavaScript(是的,即使使用ES6 class语法,它只是糖,还有JavaScript中的实际类。)

通过将属性添加到对象的原型,您可以确保 以及具有相同原型的任何其他对象 共享这个属性,这意味着他们都拥有它,但这也意味着如果你在一个上改变它,它将随着它们全部改变。糟糕。

使用new关键字创建新对象非常简单:

  1. 创建一个空对象
  2. 使该对象原型与构造函数的原型相同
  3. 使用this作为新创建的对象调用构造函数。
  4. 因此,向对象的原型添加属性将使它在同一构造函数的所有实例之间共享,而在构造函数中将其添加到this将仅在此特定实例上使用它。因为它是在构造函数中设置的,所以假设所有实例都包含该变量是安全的,尽管它不会与所有其他实例共享。

    当您调用JavaScript属性时,引擎将在以下方面查找它:

    1. 查找对象本身的属性(该对象的方法内部为this
    2. 如果未找到,请在对象的原型
    3. 上查找属性
    4. 如果没有找到,请转到原型链并在那里寻找
    5. 因此,在您的Person示例中,查找链将如下所示:

      this > Person.prototype > Object.prototype
      

      构造函数的将如下所示:

      this > Person.prototype > Function.prototype > Object.prototype
      

      Person是一个函数,因此它的原型继承自Function.prototype,类似地,任何函数都是Object。

      那么就你的具体问题而言:

      1. 函数声明不是原型。请参阅上面的对象创建过程。
      2. 不,this在此实例上应用该属性,而prototype在所有实例之间共享。