Javascript对象都是一样的

javascript objects are these all the same

本文关键字:一样 对象 Javascript      更新时间:2023-09-26

与下面的代码有什么不同

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
    }
}

发生了什么

   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,本地属性total设置为0,本地函数discountPercent和静态函数calculateTax

var StaffMember = function(name){
    this.name = name;
    this.discountPercent = function(){
            //do stuff
    };
}
StaffMember.prototype.calculateTax = function(){
//work out tax
};

这与上面的相同,只是没有total属性。注意,到目前为止,您还没有创建我认为您正在尝试创建的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(),你所创建的对象和你在第三个例子中直接创建的对象之间就会有一些区别。

最重要的是原型对象将在对象之间共享,而不是每次创建新对象时都创建新对象。这不是特别重要,因为你只是在那里放了一个函数,所以实际性能是一样的,但它会节省一些内存,如果你在原型上放了一个像数组这样的对象,它会有不同的行为。

对于前两个函数,当您调用它们(构造函数)时,它们会创建对象。然而,它们在原型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,但当实际调用该函数时,thiscalculateTax原型函数中的上下文将是调用该函数的对象本身。即上面例子中的objStaffMember

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

相关文章: