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
是可以的,有些人使用这种方法,但是,一个缺点是这些属性将被锁定在各个实例上。使用原型可以使更改影响到每个实例。