1. 創建對象的幾種方式 ...
1. 創建對象的幾種方式
/** * 普通方式 */ var obj = {}; obj.name = 'XingyaZhao'; obj.age = 23; obj.intro = function () { return "My name is " + this.name + ", and I'm " + this.age + "."; }; alert(obj.intro());
/** * 工廠模式 */ function createObject(name,age) { var obj = {}; obj.name = name; obj.age = age; obj.intro = function () { return "My name is " + this.name + ", and I'm " + this.age + "."; }; return obj; } var obj1 = createObject('XingyaZhao',23); var obj2 = createObject('HailinWang',22); alert(obj1.intro()); alert(obj2.intro());
/** * 構造函數方式 */ function Person(name, age) { this.name = name; this.age = age; this.intro = function() { return "My name is " + this.name + ", and I'm " + this.age + "."; }; } var zhao = new Person('XingyaZhao',23); var wang = new Person('HailinWang',22); alert(zhao.intro()); alert(wang.intro());
構造函數方式與工廠模式的區別
1.構造函數沒有new Object,但它後臺會自動var obj = new Object
2.this就相當於obj
3.構造函數不需要返回對象引用,它是後臺自動返回的
構造函數方式的規範
1.構造函數也是函數,但函數名第一個字母大寫
2.必須通過 new 構造函數名() 來創建對象,new Person()
2. 原型
我們創建的每個函數都有一個 prototype(原型)屬性, 這個屬性是一個對象, 它的用途是包含 可以由特定類型的所有實例共用的屬性和方法。邏輯上可以這麼理解: prototype 通過調用構造函數而創建的那個對象的原型對象。使用原型的好處可以讓所有對象實例共用它所包含的屬性和方法。 也就是說, 不必在構造函數中定義對象信息, 而是可以直接將這些信息添加到原型中。
/** * 原型 * * 當實例化多個Person的時候,共用同一個species屬性和intro方法,而name和age屬性存在於每一個實例對象里。 * 我們一般將實例特有的屬性放在構造函數里,將共有的屬性和方法放在原型里,這樣的好處是可以節省記憶體。 */ function Person(name, age) { this.name = name; //實例屬性 this.age = age; //實例屬性 } Person.prototype = { //這裡Person.prototype指向了一個新對象{},所以要將這個對象的constructor指向Person,否則會指向Object constructor: Person, species: 'animal', intro: function () { return "My name is " + this.name + ", and I'm " + this.age + "."; } }; var xyz = new Person('XingyaZhao',23); alert(xyz.intro()); alert(xyz.constructor); console.log(xyz);