是否可以在不使用原型(prototype)的情况下向函数添加属性?我知道使用原型(prototype)您可以执行以下操作:
function Gadget(name, color) {
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
如果没有原型(prototype)对象,可以实现同样的目标吗?
最佳答案
您所问的内容有点困惑。您当前没有为您的方法或属性使用原型(prototype)(无法从您的问题中判断您是否意识到这一点),并且如果您使用 new
从函数创建对象,那么该技术就可以正常工作像这样:
function Gadget(name, color) {
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
var x = new Gadget("Faucet", "red");
x.whatAreYou(); // returns 'I am a red Faucet'
工作演示:http://jsfiddle.net/jfriend00/wPP7N/
当使用new
运算符时,它会创建一个新对象并调用函数,并将this
分配给新对象。添加到构造函数中 this
指向的对象的任何属性都会成为新对象的属性。
事实上,在您的示例中,具有动态值(如 name
和 color
)的属性通常在构造函数中这样分配,因为使用原型(prototype)没有什么优势它们是因为它们被分配了一个动态值。使用原型(prototype)分配诸如 whatAreYou
方法之类的方法具有性能优势,因为在构造函数时需要运行的代码较少 - 尽管差异并不大。
为了进行比较和对比,使用原型(prototype)定义方法的代码如下所示:
function Gadget(name, color) {
this.name = name;
this.color = color;
}
Gadget.prototype.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
var x = new Gadget("Faucet", "red");
x.whatAreYou(); // returns 'I am a red Faucet'
<小时/>
如果你只是简单地调用该函数,如下所示:
Gadget();
然后,没有创建新对象,并且 this
将指向全局对象,或者将是 未定义
(在严格模式下),因此属性不会打开特定于小工具的对象。
关于javascript - 不使用原型(prototype)向函数添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748737/