構(gòu)造函數(shù)通過prototype獲取到原型
原型通過construxtor
實(shí)例通過_ proto _找到原型
構(gòu)造函數(shù)與工廠函數(shù)之間差異: 1.工廠函數(shù)需要?jiǎng)?chuàng)建對(duì)象,以及必須有返回值 2.工廠函數(shù)針對(duì)的都是Object的對(duì)象模型,而構(gòu)造函數(shù)可以匹配自定義的對(duì)象模型 即前者不論創(chuàng)建什么都只有一個(gè)xx instanceof Object 而后者根據(jù)自定義名而定類型,如上舉例所示 3.構(gòu)造函數(shù)弊端,如果在全局中定義相同的局部變量,容易造成全局污染,因?yàn)閠his.xx如果在局部獲取不到,就會(huì)去全局中獲取 4.構(gòu)造函數(shù)可以重寫,可以在全局中添加新屬性和方法Person.prototype = {},但工廠函數(shù)只能在局部添加 各自適用場(chǎng)合: 構(gòu)造函數(shù):適應(yīng)用于大型項(xiàng)目,屬性以及方法時(shí)常變換的項(xiàng)目 工廠函數(shù):適應(yīng)用于小型項(xiàng)目,或者正在制作過程還沒有成型的項(xiàng)目
工廠模式 :
特點(diǎn):
1.顯示創(chuàng)建的對(duì)象
2.顯示返回的一個(gè)對(duì)象
3:缺點(diǎn) :無法判斷對(duì)象的類型
構(gòu)造函數(shù)的特點(diǎn):
1.沒有顯示的創(chuàng)建對(duì)象
2.隱式返回了新的對(duì)象
3.可以判斷對(duì)象類型(屬于這個(gè)構(gòu)造函數(shù))
4.缺點(diǎn):
因私有而冗余:所有的方法和屬性都會(huì)在實(shí)列上創(chuàng)建一遍
function Factory(name, age, sex, car) {
this.name = name;
this.age = age;
this.sex = sex;
this.car = car;
this.eat = function (food) {
console.log('吃' + food)
}
}
var obj = new Factory('我是', 10, 'nan', 'ff')
console.log(obj)
模擬構(gòu)造函數(shù)創(chuàng)建對(duì)象(和上邊這個(gè)函數(shù)關(guān)聯(lián)著呢)
var obj = {};
Factory.call(obj, 'll', 18, '男');
obj._poroto_ = Factory.prototype;
console.log(obj)
原型模式
將屬性和方法都放在原型對(duì)象上
function Hyj() { }
console.log(Hyj.prototype);
Hyj.prototype.name = 'hyj';
Hyj.prototype.age = 18;
Hyj.prototype.sex = '男';
Hyj.prototype.eat = function (food) {
console.log('吃' + food);
}
問題:
本質(zhì):因?yàn)楣蚕淼奶卣?,?dǎo)致原型上引用類型在各個(gè)實(shí)列上會(huì)影響
原型中所有屬性是被很多實(shí)列共享的
對(duì)于包含引用類型值的屬性來說,問題有點(diǎn)大
4.組合式 : 結(jié)構(gòu) + 原型
私有的屬性
function People(name, age, sex) {
this.name = name; this.age = age; this.sex = sex;
} // 共享的方法
People.prototype.eat = function (food) {
console.log('吃' + food);
}
var a = new People(1, 2, 3)
console.log(a)