第一種創(chuàng)建對象的方式:
創(chuàng)建JSON對象
推薦使用的場合: 作為函數(shù)的參數(shù),臨時只用一次的場景。比如設(shè)置函數(shù)原型對象。
var object = { name: "Eric", age: 24, sayHi: function(){ console.log("My name is "+ this.name + " this year is " + this.age + "years old.") } };
第二種創(chuàng)建對象的方式:
創(chuàng)建一個Object對象
var object = new Object(); object.name = "Eric"; object.age = 24; object.sayHi = function(){....};
以上兩種創(chuàng)建對象方式的缺點:不能作為對象創(chuàng)建的模板,也就是不能用new進行構(gòu)造新對象。
第三種創(chuàng)建對象的方式:
function Person() { this.name = "Eric"; this.age = 24; this.sayHi = function(){ console.log(this.name); } } var object1 = new Person(); var object2 = new Person();
這種創(chuàng)建對象方式解決了前兩種方式的缺點,可以作為對象創(chuàng)建的模板,可以一直復(fù)用創(chuàng)建出多個對象。
new運算符的作用:
執(zhí)行構(gòu)造函數(shù)(new后面的那個函數(shù)),在構(gòu)造函數(shù)內(nèi)部創(chuàng)建一個空對象
把上一部創(chuàng)建的空對象跟構(gòu)造函數(shù)的原型對象進行關(guān)聯(lián)
然后把this指向當(dāng)前空對象
在構(gòu)造函數(shù)執(zhí)行結(jié)束后,如果沒有return,把空對象返回給object
new運算符原理
第三種方式有個缺點: 對象的內(nèi)部的函數(shù)會在每個對象中都存一份如果創(chuàng)建的對象非常多的話,那么非常浪費內(nèi)存。函數(shù)的行為是所有對象可以共有,不需要每個對象都保存一份。所以,可以把函數(shù)放到原型中進行聲明,那么所有對象都有了公共的函數(shù),而且內(nèi)存中只保留一份。所有的屬性寫到對象的內(nèi)部
第三種方式beta1:
function Person() { this.name = 'Eric'; this.age = 24; } Person.prototype = { sayHi: function() { }, }; var object1 = new Person(); var object2 = new Person();
繼續(xù)升級 beta2 :
function Person(name,age) { this.name = name || ""; this.age = age || ""; } Person.prototype = { sayHi: function() { }, }; var object1 = new Person(name1,age1); var object2 = new Person(name2,age2);
問題:1、調(diào)用者如果傳遞參數(shù)的順序發(fā)生變化,那么廢了
問題:2、參數(shù)增減都會導(dǎo)致函數(shù)聲明變化,調(diào)用的地方也可能發(fā)生變化。
如何解決:繼續(xù)升級 beta3 :
function Person(option) { //用一個對象把所有參數(shù)覆蓋 this.name = option.name || ""; this.age = option.age || ""; } Person.prototype = { sayHi: function() { }, }; var object1 = new Person({ name: "Eric", age: 24 }); var object2 = new Person({ name: "XXX", age: xx });
繼續(xù)優(yōu)化,把初始化的代碼 放到init函數(shù)中
繼續(xù)升級 beta4 :
function Person(option) { this._init(option); } Person.prototype = { _init: function (option){ this.name = option.name; this.age = option.age; }, sayHi: function(){ console.log("HI"); } }; var object1 = new Person({ name: "Eric"; age: 24 }); object1.sayHi();
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com