是否可以在不使用原型的情况下向函数添加属性?我知道使用原型您可以执行以下操作:
function Gadget(name, color) {
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
如果没有原型对象,同样的目标可以实现吗?
是否可以在不使用原型的情况下向函数添加属性?我知道使用原型您可以执行以下操作:
function Gadget(name, color) {
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
如果没有原型对象,同样的目标可以实现吗?
你问的内容有点混乱。您目前没有为您的方法或属性使用原型(无法从您的问题中判断您是否意识到这一点),并且如果您从函数中创建一个对象,则该技术可以正常工作,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
在构造函数中像这样分配,因为为它们使用原型几乎没有优势,因为它们被分配了动态值。分配方法(例如whatAreYou
使用原型的方法)具有性能优势,因为在构造函数时需要运行的代码更少——尽管差异并不大。
为了比较和对比,使用原型定义方法的代码如下所示:
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
将指向全局对象或将undefined
(在严格模式下),因此属性不会位于特定于小工具的对象上。
请参阅对您的问题的评论(您实际上并没有使用原型),但只是为了帮助您理解,使用原型看起来像这样:
function Gadget(name, color) {
this.name = name;
this.color = color;
}
Gadget.prototype.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}