[面试专题]js之面向对象(OOP)

 阅读约 5 分钟

js之面向对象(OOP)

js对象类型(Object)

  1. js数据类型分六类,简单类型:Undefined,Null,Bollean,Number,String五种,复杂类型:Object.
    其中Undefined、Null、Boolean、Number也属于基本类型。Object、Array和Function则属于引用类型

  2. 其中Null类型表示一个空对象引用,typeof (null类型)会返回object

  3. 简单类型和复杂类型之间的关系: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);
阅读 1.4k更新于 2017-08-29
推荐阅读
前端进阶计划
用户专栏

前端面试专题与日常研究

84 人关注
17 篇文章
专栏主页
目录