js創建對象(js小知識)

js創建對象

  1. 工廠模式
		function Person(name, age){
			var o = new Object();
			o.name = name;
			o.age = age;
			o.sayName = function(){
				console.log(this.name);
			};
			return o;
		};
		var p = new Person('viven', 28); 
		console.log(p.constructor == Person); // false

工廠模式最大的問題就是不能識別對象,可以用構造函數解決。

  1. 構造函數

構造函數的創建會經歷一下幾個步驟
(1) 創建一個新對象;
(2) 將構造函數的作用域賦給新對象(因此 this 就指向了這個新對象);
(3) 執行構造函數中的代碼(爲這個新對象添加屬性);
(4) 返回新對象

		function Person(name, age){
			this.name = name;
			this.age = age;
			this.sayName = function() {
				console.log(this.name);
			};
		};
		var p = new Person('viven', 28);
		console.log(p.constructor == Person); // true
		
		var p1 = new Person('kevin', 30);
		console.log(p.sayName == p1.sayName); // false  不是同一個函數。

構造函數解決了工廠函數的對象不能識別的問題,但是出現的新問題就是每次新建一個實例就會新建一個sayName函數,如果有很多,就會創建很多相同的函數。
以上,兩個實例的sayName函數不是同一個,造成了資源的浪費,這就引出了原型模式。

  1. 原型模式
		function Person(){};
		Person.prototype = {
			name: 'viven',
			age: 28,
			sayName: function() {
				console.log(this.name);
			}
		}
		var p = new Person();
		var p1 = new Person();
		console.log(p.sayName == p1.sayName) // true 是同一個函數
		console.log(p.constructor == Person) // false
		
		// 因爲直接用對象的方式創建原型,會改寫原型,那麼constructor指向就會切斷原聯繫,一般會這樣做
		Person.prototype = {
			constructor: Person,
			name: 'viven',
			age: 28,
			sayName: function() {
				console.log(this.name);
			}
		}
		console.log(p.constructor == Person) // true
		

這樣就能解決重複創建函數的問題,當然這樣就不能傳遞參數進去,進行個性化的設置,那麼我們可以使用構造函數和原型模式的組合來解決這個問題。

  1. 構造函數和原型模式的組合用法

這樣既可以個性化設置自己的屬性,同時可以節約內存,創建一個公用函數。

		function Person(name, age){
			this.name = name;
			this.age = age;
		};
		Person.prototype = {
			constructor: Person,
			sayName: function() {
				console.log(this.name);
			}
		}
		var p = new Person('viven', 30);
		var p1 = new Person('kevin', 28);
		console.log(p.sayName == p1.sayName) // true

以上就是js創建對象的小知識,當然最主要的瞭解構造函數和原型的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章