这些javascript对象都是一样的

时间:2013-04-04 13:38:32

标签: javascript

与以下代码有什么区别

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

    }
}

2 个答案:

答案 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

前两个函数的细微差别是,因为第二个函数没有名称而且它有一个赋值,它是一个没有名字的函数表达式,第一个是函数声明并且有一个名字。