4

下面的代码有什么区别

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

    }
}
4

2 回答 2

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 之后,否则这将创建一个具有 name、discountPercent 和 calculateTax 属性的对象。

这个对象实际上是存在的,因为你已经直接创建了它,对于你需要调用的其他对象var something = new StaffMember()

差异

1 和 2 之间没有显着区别,除了在函数中定义这些东西的位置(第一个示例将被提升到当前函数范围的顶部,第二个示例直到代码中的那个点才会设置)。

一旦你调用了new StaffMember(),你正在创建的对象和你在第三个示例中直接创建的对象之间会有一些差异。

最重要的是原型对象将在对象之间共享,而不是每次创建新对象时都创建新对象。这并不是很重要,因为您只是在其中放置了一个函数,因此实际性能将是相同的,但它会节省一些内存,并且如果您在原型上放置一个像数组这样的对象,它的作用会有所不同。

于 2013-04-04T13:45:25.897 回答
2

对于前 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在上述情况下。

前 2 个函数的小区别是,因为第二个没有名称,它有一个赋值,它是一个没有名称的函数表达式,第一个是函数声明,有一个名称。

于 2013-04-04T13:45:29.253 回答