var Person = function(firstname, lastname){
  this.firstname = firstname;
  this.lastname = lastname;
};

Person.greet = function(){
  console.log("Hello there ! "+ "My name is: "+ this.firstname);
};

var nk = new Person('Mark', 'Z');
console.log(nk.firstname);

nk.greet(); // Error in attaching


因此,我试图将函数“ greet”附加到其外部的构造函数“ Person”上。我当然可以用原型做到这一点,但只是想了解为什么上面的代码不起作用?

例如:这将起作用:

var Person = function(firstname, lastname){
      this.firstname = firstname;
      this.lastname = lastname;
      this.greet = function(){
      console.log("Hello there ! "+ "My name is: "+ this.firstname);
    };
    };

    var nk = new Person('Mark', 'Z');
    console.log(nk.firstname);

    nk.greet();


从MDN:


  使用Function构造函数创建的Function对象在以下情况下进行解析
  函数已创建。这比声明a效率低
  具有函数表达式或函数语句并调用的函数
  它在您的代码中,因为此类函数已与其余函数一起解析
  代码。
  
  传递给该函数的所有参数均被视为
  在要创建的函数中,参数的标识符
  它们传递的顺序。
  
  将Function构造函数作为一个函数调用(不使用new
  运算符)与调用它作为构造函数具有相同的效果。
  
  全局Function对象没有自己的方法或属性,
  但是,由于它本身是一个函数,因此它确实继承了一些方法
  以及来自Function.prototype的原型链的属性。
  
  函数实例函数实例继承方法和属性
  来自Function.prototype。与所有构造函数一样,您可以更改
  构造函数的原型对象,以对所有Function进行更改
  实例。

最佳答案

您已经知道答案了-使用函数的原型对象,该对象专门用于创建构造函数的新实例。考虑一下您实际在做什么:

function foo () {
  this.prop = 1
}

foo.bar = function () {
  return this.prop // - not defined
}

foo.prototype.baz = function () {
  return this.prop  // 1
}

var f = new foo()
f.bar // undefined; f.bar() // => Error
foo.bar // a function that returns undefined when called
f.baz // a function that returns 1 when called
foo.baz // undefined; foo.baz() // => Error


重点是:实例= / =构造函数= / =原型对象。您直接在构造函数上定义属性,这意味着您可以从构造函数Person.greet()调用该属性(即使在构造函数中的对象上定义的任何内容都将是未定义的,因为在这种情况下不会调用构造函数)。您不能从函数实例中调用该方法,因为该实例是与构造函数分开的对象。在构造函数中定义this.greet是可以的,有些人使用这种方法,但是,一个缺点是这些属性将被锁定在各个实例上。使用原型可以使更改影响到每个实例。

09-11 18:30
查看更多