JS物件宣告的幾種方式
-- 新手向知識,就不用ES6寫法了。
一、字面量宣告
var obj = {
屬性名1 : 屬性值,
屬性名2 : 屬性值,
屬性名3 : 屬性值,
方法名1 : function() {
.....
},
方法名2 : function() {
.....
}
}
通過obj.屬性名
或obj.方法名()
就可以讀取或呼叫物件的屬性/方法了。
二、用new操作符構造Object物件
var obj = new Object(); obj.屬性名1 = 屬性值1; obj.屬性名2 = 屬性值2; obj.屬性名3 = 屬性值3; obj.屬性名4 = 屬性值4; obj.方法名1 = function() { .... }; obj.方法名2 = function() { .... }; ....
首先用new Object()
建立一個空物件,然後用多條語句給物件新增屬性/方法。
三、用函式宣告的方式構造物件函式Function
本身就是物件Object
的例項
var fn = new Function(); //new一個空函式
function myFn() {}; //宣告一個空函式
console.log(fn instanceof Object); //true
console.log(myFn instanceof Object); //true
所以可以模仿new Objcet()
構造物件的方式,用function myFn() {}
宣告一個自定義的函式,然後通過new myFn()
構造物件,比如:
function person(name, age) { this.name = name; this.age = age; this.say = function() { console.log('My name is '+ this.name + ', I\'m ' + this.age + ' years old'); } } var xiaoMing = new person('xiaoming', 16); xiaoMing.say(); //"My name is xiaoming, I'm 16 years old"
通過這種方式宣告的物件,每一次new
出來的物件都是獨立的,互相不會有影響,屬性、方法中的this
指向的就是新建立的、呼叫他們的物件。
四、工廠模式宣告物件工廠模式宣告物件可以理解成二、三兩種方法的結合體,用三的思想套進二的內容。仿照上面例子舉例:
function person(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.say = function() {
console.log('My name is '+ obj.name + ', I\'m ' + obj.age + ' years old');
};
return obj;
}
var xiaoMing = person('xiaoming', 16);
xiaoMing.say(); //"My name is xiaoming, I'm 16 years old"
var xiaoHong = person('xiaohong', 18);
xiaoHong.say(); //"My name is xiaohong, I'm 18 years old"
工廠模式之所以叫工廠模式,就是類似於現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果。他的寫法與三、用函式宣告的方式構造物件
比較像,但是稍有不同。
每一次呼叫function
宣告的函式時,它在內部new Object()
,最後將這個新建的物件return
回來,呼叫時就像普通函式呼叫一樣,例項化的時候不用再new
了(內部new過)。雖然多次呼叫該函式走的都是一樣的流程,但是生產出來的兩個產品互不影響。
五、原型方式宣告物件
function person() {/*空*/};
person.prototype.height = "1.80m";
person.prototype.grade = "Senior 3";
person.prototype.say = function() {
console.log( 'I\'m ' + this.height + ' tall and I\'m in '+ this.grade);
}
var xiaoMing = new person();
xiaoMing.say(); //"I'm 1.80m tall and I'm in Senior 3"
原型方式是將該物件的屬性/方法寫在他的prototype
屬性所指的物件上。(每一個函式或者說物件都有一個prototype
屬性,這個屬性以物件的形式存在)。
每次new
實際上有這麼一些操作:
1)建立一個空物件2)把這個空物件的__proto__
指向建構函式的prototype
3)把這個空物件賦值給this
4)執行建構函式內的程式碼
new
出來的新物件的__proto__
屬性都會指向person.prototype
,然後就可以執行person.prototype
上的函式內容了。
這有點像JS上常說的事件代理/委託。事件不直接繫結在該DOM元素上,而是繫結在它的父級元素,當給該DOM元素新增兄弟元素時,兄弟元素因為冒泡,能觸發相同的事件。
六、混合模式混合模式可以理解成原型模式+建構函式,舉例:
function person(name, height) {
this.name = name;
this.height = height;
};
person.prototype.age = 18;
person.prototype.grade = "Senior 3";
person.prototype.say = function() {
console.log('Hello, my name is ' + this.name + '. I\'m ' + this.age + ' years old, ' + this.height + ' tall and I\'m in '+ this.grade + '.');
}
var xiaoMing = new person('Xiaoming', '1.80m');
xiaoMing.say();
//"Hello, my name is Xiaoming. I'm 18 years old, 1.80m tall and I'm in Senior 3."
var xiaoHong = new person('Xiaohong', '1.65m')
xiaoHong.say();
//"Hello, my name is Xiaohong. I'm 18 years old, 1.65m tall and I'm in Senior 3."
對比混合模式和原型模式可以發現,混合模式函式體不是空的,而函式體內的內容就是前邊說的構造方式。
這種方式在實際開發中更加常用。