与以下代码有什么区别
1)前两个构造函数是否只是具有不同的范围?
2)如果它们被实例化为对象,那么第三个对象与前两个对象相同吗?
谢谢你的帮助?
function StaffMember(name){
this.name = name;
this.total = 0;
this.discountPercent = function(){
//do stuff
};
}
StaffMember.prototype.calculateTax = function(){
//work out tax
};
或
var StaffMember = function(name){
this.name = name;
this.discountPercent = function(){
//do stuff
};
}
StaffMember.prototype.calculateTax = function(){
//work out tax
};
或
var StaffMember {
name:"",
discountPercent:function(){
//do stuff
},
calculateTax : function(){
//work out tax
}
}
答案 0 :(得分:2)
function StaffMember(name){
this.name = name;
this.total = 0;
this.discountPercent = function(){
//do stuff
};
}
StaffMember.prototype.calculateTax = function(){
//work out tax
};
这会创建一个构造函数并为其原型添加另一个函数。如果然后调用new StaffMember("bob")
,它将创建一个对象,其本地属性名设置为bob
,本地属性总数设置为0,本地函数discountPercent和静态函数calculateTax
var StaffMember = function(name){
this.name = name;
this.discountPercent = function(){
//do stuff
};
}
StaffMember.prototype.calculateTax = function(){
//work out tax
};
除了没有总属性外,这相当于上述内容。请注意,到目前为止,您还没有创建我认为您正在尝试创建的此StaffMember对象的实例。你刚刚定义了一个功能,并在其原型上添加了另一个功能
var StaffMember {
name:"",
discountPercent:function(){
//do stuff
},
calculateTax : function(){
//work out tax
}
}
这是无效的语法,在StaffMember之后需要=
,否则这将创建一个名为discountPercent和calculateTax属性的对象。
这个对象实际上是存在的,因为你是直接创建的,对于你需要调用var something = new StaffMember()
的其他对象。
1和2之间没有显着差异,除了函数中定义这些东西的地方(第一个例子将被提升到当前函数范围的顶部,第二个例子在此之前不会被设置在代码中。)
调用new StaffMember()
后,您正在创建的对象与您在第3个示例中直接创建的对象之间会有一些差异。
最重要的是原型对象将在对象之间共享,而不是每次创建新对象时都创建新对象。这不是非常重要,因为你只是在那里放了一个函数,所以实际的性能会相同,但它会节省一些内存,如果你把一个像数组的对象放在原型上,它会有不同的行为。
答案 1 :(得分:2)
对于调用它们的前两个函数(构造函数),它们会创建对象。但是它们都共享原型calculateTax
中的函数。最后一个是对象,一个具有数据和功能的对象文字。
function StaffMember(name){
this.name = name;
this.total = 0;
this.discountPercent = function(){
//do stuff
};
}
StaffMember.prototype.calculateTax = function(){
//work out tax
console.log(this.total);
};
var objStaffMember = new StaffMember("User");
objStaffMember.total = 50;
objStaffMember.calculateTax();
虽然创建的对象将共享函数calculateTax
,但是当实际调用该函数时,this
原型函数中的calculateTax
的上下文将是调用它的对象本身。 。在上述情况下是objStaffMember
。
前两个函数的细微差别是,因为第二个函数没有名称而且它有一个赋值,它是一个没有名字的函数表达式,第一个是函数声明并且有一个名字。