对象的创建
?
/*
*工廠模式
*
*/
//工廠模式:用函數來封裝以特定接口創建對象的細節
//雖然解決了創建多個相似對象的問題,但是沒有解決對象識別的問題(即怎么知道一個對象的類型)
/*
*構造函數模式
*
*/
//構造函數模式,
//像object和array這些是原生的構造函數,我們也可以創建自定義的構造函數來實例化,new一個實例。以下面這種方式定義的構造函數是定義在Global對象(在瀏覽器中是windows對象)中。
//構造函數的問題:我person3和person4都有一個方法就是sayName這個方法,這兩個方法的目的都是一樣的,說出自己名字。但是我實例化的時候,person3和person4都是不同的function實例。意思就是雖然我們做的事一樣,但我們出生的時候是不一樣的。這樣會導致不同的作用域鏈和標識符解析。
//解決的辦法就是像下面這樣,把方法的定義放到函數外面。這樣我person3和person4的方法用的都是同一個函數了。
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName; } function sayName(){ alert(this.name); } var person3=new Person("chenjj",20,"boss"); var person4=new Person("wangcc",18,"boss");//但是,問題又來了,要是我有多個方法呢?豈不是我要定義很多個全局函數?那么,原型模式就出場了。
/*
*原型模式
*
*/
//我們創建的每一個函數都有一個prototype(原型)屬性,這是一個指針,指向的是一個對象。這個對象里面包含的是可以由特定類型的所有實例共享的屬性和方法。就像上面的Person構造函數,他也有一個prototype屬性,這個prototype指向的對象就是Person的實例的原型對象。就是person3和person4的原型對象。
//當我們執行,person5.name的時候會先在person5這個實例中找,有的話就返回name的值,
//沒有的話就繼續向原型對象中找。
//我們可以用對象字面量來重寫原型對象
?
//但是我們既然重寫了原型對象,那么構造函數和原型對象之間的聯系就會改變了,原型對象的constructor屬性不再指向原來的Person構造函數了,而是Object構造函數。所以重寫整個原型對象,情況就不一樣了。
//原型模式也有他的問題,我們知道用原型模式,所有實例都能共享相同的數據。但總得有些屬于自己的東西吧。總不可能你這個實例修改了姓名,而其他實例的姓名也迫不得已變的和你一樣了吧。
?
//實例的屬性都是在構造函數中定義的,你增添和刪除你的屬性并不影響我下一個實例的創建。而共享的屬性和方法則是在原型中定義。
?
轉載于:https://www.cnblogs.com/jjucap/p/5536794.html
總結
- 上一篇: DDD关键知识点整理汇总
- 下一篇: spynner安装