對象:由多組無序?qū)傩越M成的數(shù)據(jù)結(jié)構 (鍵值對) 成對出現(xiàn):屬性名 屬性值
字面量 簡單對象也存在構造函數(shù) (如:下面的dog其構造函數(shù)是Objecd 數(shù)值Number ??)
var dog = {name:"tom",age:2};
構造函數(shù) 批量創(chuàng)建同類對象
function Dog(name,age){this.name = name; this.age = age;}
對象的屬性名是單例的 所以屬性值單例(成對出現(xiàn))
[如果創(chuàng)建多個同名屬性對應著屬性值帆谍,值/地址存在棧中 1.基本數(shù)據(jù)類型存的具體值 屬性名指向它 你再來一個同名的屬性名、還是本來的屬性名 所以還指向原來的值 現(xiàn)在你把指向的值變了 現(xiàn)在的值就替換了原來的值)所以屬性名是單例、多例的話之前的也會被覆蓋掉,同樣也解釋了DOM0級事件只支持一個同名事件名的處理程序(oDiv.onclick=function(){} 屬性名=屬性值);
由于dom0 事件處理本質(zhì)上是對象屬性的賦值操作架曹,由于數(shù)值值唯一的特點拾枣。所以dom0方式只能為dom對象綁定一個有效的事件處理函數(shù)庸论。2.引用數(shù)據(jù)類型存的是地址 屬性名指向地址(值在堆中 同上),如果 字面量 new 會在堆中重新開辟空間]
原型:(構造函數(shù)具有prototype屬性) 函數(shù)對象通常具有一個prototype的屬性叫做原型屬性
原型屬性中的所有屬性可以為其創(chuàng)建的對象共用
實例:構造函數(shù)創(chuàng)建的對象 相對于 構造函數(shù) 叫構造函數(shù)的實例
每個對象都有一個proto屬性 指向其構造函數(shù)的原型
js中沒有繼承焕窝,但可以通過構造函數(shù)的原型屬性 來搭建繼承 原型繼承
繼承:上級函數(shù)的實例a賦值給下級函數(shù)的原型、下級函數(shù)的實例就可指向這個實例a (這個實例a是現(xiàn)在下級函數(shù)的原型)
function Dog(name){ this.name = name; }
Dog.prototype.say = function(){ console.log("wangwang" );}
var d = new Dog("tom");
d.proto 指向函數(shù)原型 原型誰創(chuàng)建的刨裆、底層的 Object對象創(chuàng)建的 所以輸出Object{}
d實例是Dog對象創(chuàng)建的 打印d 輸出Dog{}
注意:下級函數(shù)要先繼承 后創(chuàng)建對象(實例) [如果后繼承:下級函數(shù)的實例指向的原型是下級函數(shù)原來的原型,只要繼承原型就改變了澈圈,所以在繼承前訪問原型中的屬性訪問不到]
存在弊端:上級函數(shù)實例a賦值給下級函數(shù),實例a的私有屬性帆啃、共有屬性(下級要的)都給了下級函數(shù)原型中(原型繼承無法解決私有屬性構建邏輯的復用) 邏輯指屬性
原型方式的繼承不能實現(xiàn)多繼承瞬女,但可以多級繼承,因為原型繼承的本質(zhì)就是屬性賦值努潘。屬性值單例的
(stu.proto.proto.proto.proto null)
原型鏈:構造函數(shù)原型通過函數(shù)之間原型繼承诽偷,逐級鏈接坤学,組成鏈型結(jié)構
多繼承: 借用構造函數(shù)的繼承,解決了私有屬性初始化邏輯的復用(使用call报慕、apply借用上級私有屬性初始化邏輯深浮,初始化邏輯就是下級屬性的初始化)
借用構造函數(shù)方式的繼承: 通過call apply 函數(shù)名.call(要替換的對象名/this指向的對象,函數(shù)的實參) 看的是構造函數(shù)
組合繼承:原型繼承與多繼承放在一起 (兩者互不影響)
寄生方式繼承:1.創(chuàng)建一個過渡函數(shù) 使上級函數(shù)的原型代替過渡函數(shù)的原型
(tmpFn.prototype = Car.prototype);
[原型是底層創(chuàng)建的原有的 Objecd 誰(上級)創(chuàng)建原型、原型中有個屬性constructor(指向下級函數(shù))眠冈;所以沒有了它會隔級找]
2.然后 創(chuàng)建多度函數(shù)的實例a 把實例a賦值給下級函數(shù)的原型
因為constructor(指向函數(shù)) 是原型中的屬性所以實例本身沒有constructor飞苇、在原型里(proto里,proto指向原型)蜗顽;所以把實例a賦值給下級函數(shù)的原型時 只有proto布卡,constructor沒有,要手動添加上(不然在指向函數(shù)時會隔級找)
Bike.prototype.constructor = Bike;