一,定義:
對象是JavaScript的一個基本數據類型,是一種複合值,它將不少值(原始值或者其餘對象)聚合在一塊兒,可經過名字(name/做爲屬性名)訪問這些值。即屬性的無序集合。html
關鍵是name屬性名能夠是什麼類型,如下是一些測試(不完整):python
二,建立對象的方法數組
1.在{}內直接建立鍵值對,如上測試示例函數
2.使用實例化類的方法:new + Object()測試
let car = new Object(); //實際上,car.type的寫法最終在後臺自動轉爲car['type']執行的 car.type = 'Honda'; //等同於car['type'] = 'Honda' car.color = 'white'; //等同於 car['color'] = 'white' cat.seat = 5; //等同於 cat['seat'] = 5
car.sayColor = function(){alert(this.color)}
因爲1,2兩種方法在使用同一接口建立多個對象時,會產生大量的重複代碼,爲此,有了工廠模式this
3.工廠模式--函數返回的形式spa
function creaeCar(type,color,seat){ let obj = new Object(); obj.type = type; obj.color = color; obj.seat = seat;
obj.sayColor = function(){alert(this.color)} return obj; }
let car01 = createCar('Honda','white',5);//instanceof 沒法判斷它是誰的實例,只能判斷是對象 person1 instanceof Object //true
因爲工廠模式沒有解決對象的識別問題,檢測到的都是object類型,不像是具體的Array,Date等類型,所以又出現了構造函數模式的建立方法。prototype
4.構造函數模式指針
1 function Car(type,color,seat){ 2 this.type = type; 3 this.color = color; 4 this.seat = seat;
this.sayColor = function(){alert(this.color)} 5 } 6 7 let car01 = Car('Honda','white',5); //此時car01 instanceof Car //true 8 console.log(Car.constructor);//返回建立此對象的數組,函數的引用
有上例能夠看出工廠模式和構造函數模式的不一樣之處:code
(1)沒有顯式地建立對象;(2)直接將屬性和方法賦給了this對象;(3)沒有return語句
實際上,調用構造函數的過程以下:
建立一個新對象==》將構造函數的做用域賦給新對象,便是將this指向這個新對象==》執行構造函數,爲新對象添加屬性==》自動返回新對象
不過構造函數也是有缺陷的,每一個實例都包含不一樣的function實例,構造函數內的方法在作同一件事,可是實例化後卻產生了不一樣的對象(方法sayColor是函數,函數也是對象)。
所以又產生了原型模式。
5.原型模式
function Car(){} Car.prototype.type = 'Honda'; //至關於python中公共的類變量 Car.prototype.color = 'white'; Car.prototype.seat = 5; Car.prototype.sayColor = function(){aleart(this.color)}; console.log(Car.prototype);//Object {type:'Honda',color:'white',seat:5} let car01 = new Car(); console.log(car01.type);//Honda
let car02 = new Car();
car02.color = 'red';
console.log(car02);//Car {color:'red'}
console.log(car02.prototype.color); //報錯的
console.log(car02.type); // 顯示的將會是原型默認的‘Honda'
原型模式的好處是全部實例共享它的屬性和方法,即公共屬性,能夠設置私有屬性值,如car02.color='red',只是針對實例car02,將覆蓋原型對象上的同名屬性(方法)。
6.混合模式(構造函數+原型模式)
構造函數模式用於定義實例屬性,原型模式用於定義方法和共享屬性
function Car(type,color,seat){ this.type = type; this.color = color; this.seat = seat; } Car.prototype = { constructor: Car, //每一個函數都有prototype屬性,指向該函數原型對象,原型對象都有constructor屬性,這是一個指向prototype屬性所在函數的指針 sayColor: function(){ alert(this.color); } } let car01 = new Car("Honda",'white',5); console.log(car01); let car02 = new Car("BMW",'blue',2); console.log(car02);
能夠看出,混合模式共享着對相同方法的引用,又保證了每一個實例有本身的私有屬性。最大限度的節省了內存
https://www.cnblogs.com/libin-1/p/5911190.html
https://www.cnblogs.com/juggdxy/p/8245491.html