js之面向对象(OOP)
js对象类型(Object)
js数据类型分六类,简单类型:Undefined,Null,Bollean,Number,String五种,复杂类型:Object.
其中Undefined、Null、Boolean、Number也属于基本类型。Object、Array和Function则属于引用类型其中Null类型表示一个空对象引用,typeof (null类型)会返回object
简单类型和复杂类型之间的关系:js中一切皆对象,所以以上简单类型也是对象,但是创建方法不同,利用typeof 检测类型时结果也不同.(这个typeof真是没啥用).例如下例中两个,但是本质上都是对象.
var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof author);//"string"
盘点JS面向对象之继承
原型链
即利用原型链让一个引用类型继承另一个应用类型的方法和属性.
缺点:
重写了原有的prototype,constructor指向了超类.
prototype是超类的实例,因此超类属性会被所有子类实例共享.
创建子类实例时,不能向超类构造函数传参.
function Subtype(){
//构造函数
}
Subtype.prototype = new Supertype();
借用构造函数(经典继承)
即在子类构造函数中调用超类构造函数,通过call或者apply来绑定上下文对象.
function Subtype(){
Supertype.call(this);//也可传参
}
缺点:
和构造函数模式一样,方法在构造函数中定义,因此就无法实现函数复用(作为方法)
在超类型的原型中定义的方法,对子类型而言也是不可见的
组合继承(伪经典继承)
即原型链+经典继承,利用原型链继承原型属性和方法,利用借用构造函数继承实例属性
function SuperType (name) {
this.name = name;
this.color = ['red'];
}
SuperType.prototype.sayName = function () {
console.log(this.name)
}
function SubType (name,age) {
SuperType.call(this,name)
this.age = age;
}
SubType.prototype = new SuperType();
SubType.constructor = SubType;
SubType.prototype.sayAge = function () {
console.log(this.age)
}
var subInstance = new SuperType('zchang',11);
var subInstance1 = new SuperType('zc',18);
寄生式继承
即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回该对象.
function createAnother (origin) {
var clone = objects(origin);//某个函数创建新对象
clone.sayHi = function () {
console.log('hi')
}
return clone;
}
组合寄生式继承
function SuperType(name) {
this.name = name;
this.color = ['red'];
}
SuperType.prototype.sayName = function() {
console.log(this.name)
}
function SubType(name, age) {
SuperType.call(this, name)
this.age = age;
}
// SubType.prototype = new SuperType();
function inheritPrototype(subtype, supertype) {
var prototype = object(supertype);
prototype.constructor = subtype;
subtype.prototype = prototy
}
inheritPrototype(SubType, SuperType);
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
console.log(this.age)
}
var subInstance = new SuperType('zchang', 11);
var subInstance1 = new SuperType('zc', 18);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。