JS的對象繼承this
這是一個單繼承spa
//Shape - superclass function Shape() { this.x = 0; this.y = 0; } Shape.prototype.move = function(x, y) { this.x += x; this.y += y; console.info("Shape moved."); }; // Rectangle - subclass function Rectangle() { Shape.call(this); //call super constructor. } Rectangle.prototype = Object.create(Shape.prototype); var rect = new Rectangle(); rect instanceof Rectangle //true. rect instanceof Shape //true. rect.move(1, 1); //Outputs, "Shape moved."
這是一個多繼承prototype
function MyClass() { SuperClass.call(this); OtherSuperClass.call(this); } MyClass.prototype = Object.create(SuperClass.prototype); //inherit mixin(MyClass.prototype, OtherSuperClass.prototype); //mixin MyClass.prototype.myMethod = function() { // do a thing };
有了上面兩個例子,咱們總結一下指針
繼承分兩個方面,實例部分跟原型部分code
實例部分用call改寫this指針加載orm
原型部分用Object.create將原形鏈複製過去對象
固然,能夠用別的方法繼承,譬如:new SuperClass() 而後再添加實例、原型等方法繼承
普及一下Object.createip
Object.create()
方法建立一個擁有指定原型和若干個指定屬性的對象。ci
Object.create(proto, [ propertiesObject ])
proto
一個對象,做爲新建立對象的原型。
propertiesObject
可選。該參數對象是一組屬性與值,該對象的屬性名稱將是新建立的對象的屬性名稱,值是屬性描述符(這些屬性描述符的結構與Object.defineProperties()
的第二個參數同樣)。注意:該參數對象不能是 undefined
,另外只有該對象中自身擁有的可枚舉的屬性纔有效,也就是說該對象的原型鏈上屬性是無效的。
若是 proto 參數不是 null
或一個對象值,則拋出一個 TypeError
異常。