function createperson(name,age)
return obj;
}var person = createperson('aa',12);
缺點:將函式抽離到外部使多個物件共共享全域性作用域的函式雖然可以解決上面問題,但讓this.sayname = sayname全域性方法會破壞了物件的封裝性
function person(name,age)
}var person = new person('aa',12);
person instanceof person => true
function person(name,age)
person.prototype.name = name;
person.prototype.age = age;
person.prototype.sayname = function()
var person = new person('aa',12);
person instanceof person => true
多個物件例項共享原型所儲存的屬性和方法的基本原理
雖然可以通過物件例項訪問儲存在原型例項中的值,但是不能通過物件例項重寫原型中的值,如果在例項中新增乙個與原型例項中的乙個屬性同名,訪問時例項屬性會遮蔽原型中這個屬性的值,只能訪問到這個例項上屬性的值。可以通過delete操作符刪除例項屬性,重新訪問原型中的屬性
使用hasownproperty()可以檢測乙個屬性是存在例項中還是原型中,只有存在例項中才會返回true;person.hasownproperty('name')
'name' in person 無論name是存在例項中還是原型物件中都會返回true
//判斷物件原型上是否有這個屬性
function hasprototypeproperty(obj, attr)
在使用for-in 迴圈時,返回的是能夠通過物件訪問的,可列舉的屬性,包括了例項上的屬性和原型上的屬性。原型上不可列舉的屬性,但是在例項中定義了也可以獲取得到,如在例項中定義tostring
object.keys() (es5)
object.getownpropertynames()(ie9+)
var friend = new person();
person.prototype.sayhi = function()
friend.sayhi() //hi
paste_image.png
當使用原型屬性時會只要在乙個例項上修改都會影響到所有的例項,例如在乙個例項上修改陣列
function person(name,age)
}**}
function person(name,age)
return o;
}var person = person('green',12);
person.sayname() //只能通過sayname()方法去訪問name的值
原型鏈繼承
缺點:借用建構函式
function suopertype(name)
function subtype(name)
subtype.prototype = new supertype();
var instance = new subtype('1')
instance.colors.push('green') => ['red','green']
var instance2 = new subtype('2')
instance2.colors.push('black') => ['red','black']
組合繼承function supertype(name)
supertype.prototype.sayname = function()
function subtype(name,age)
subtype.prototype = new supertype();
subtype.prototype.constructor = subtype;
subtype.prototype.sayname = function()
var instance = new subtype('1',12)
instance.sayname() => 1
instance.colors => ['red']
var instance2 = new subtype('2',21)
instance2.sayname() => 2
instance2.colors => ['red']
原型式繼承function object(o)
f.prototype = o;
return new f();
} var person =
var anotherperson = object(person);
anotherperson.name = 'y'; =>y
anotherperson.colors.push('c'); => ['a','b','c']
var person = object(person);
person.name = 'yy'; =>yy
person.color; =>['a','b','c']
寄生式繼承function object(o)
f.prototype = o;
return new f();
} function createanother(original)
return clone;
} var person =
var anotherperson = createanother(person);
anotherperson.sayhi(); =>hi
寄生組合式繼承
寄生組合繼承通過借用建構函式來繼承屬性,通過原型鏈混成形式來繼承方法。
思路是不必為了指定的子型別原型而呼叫超型別的建構函式。
使用寄生式繼承來繼承超型別的原型,然後再將結果指定給子型別的原型
function inheritprototype(subtype,supertype)
function supertype(name)
supertype.prototype.sayname = function()
function subtype(name,age)
subtype.prototype =inheritprototype(subtype,supertype) ;
subtype.prototype.sayname = function()
物件導向讀書筆記
靜態類和非靜態類 靜態類 靜態屬性等 是類所有的,非靜態類為類的例項所有的。靜態類是類的所有例項所共享的,無論此類建立了多少例項,靜態類在記憶體中都只開闢了一塊儲存空間。const常量也可以看成這種型別 public class myclass 呼叫時可以直接myclass.kiss my clas...
讀書筆記 物件導向
看了譚云傑老師的 thinking in uml 一書,前面講解了物件導向的內容,特此編寫一下讀書筆記。封裝 繼承 多型 構造乙個更大更複雜的系統 復用 可拓展性增強 利於分工協作 更能專注某個功能點研究,需要考慮的資訊量大大減少。現實世界如何對映到乙個物件世界?物件世界如何描述現實世界?如何驗證物...
原型物件 繼承
一 繼承的概念 物件導向的特徵就是封裝性 繼承性和多型性 1 封裝 就是將複雜的包裹起來,隱藏起來,讓簡單的東西預留在外面 2 繼承 繼承它父級,拿來主義,自己沒有,把別人拿過來 在js中有兩種繼承模型 1 原型繼承 如果需要讓乙個物件有某乙個行為 屬性,方法 那可以考慮將這個行為加到原型物件中那麼...