美文网首页
原型与继承

原型与继承

作者: memelook | 来源:发表于2017-12-11 19:21 被阅读21次

1.js是通过原型链来实现继承

基本思想是利用原型的一个引用类型继承另一个引用类型的属性和方法。原型对象将包含一个指向另一个原型的指针,而另一个原型的指针又指向它的构造函数。子类的prototype指向父类的实例。

所有对象的根类都是空的Object

var A = function(){};
A.prototype = { name: 'sven'};

var B = function(){};
B.prototype = new A();

var b = new B();
console.log(b.name);

2.确定原型和实例的关系

1).instanceof
2).isPrototypeOf()

3.继承方法

如果直接使用原型链继承,那么instance的构造函数是指向SuperType
缺点:
1).引用类型值的原型属性会被所有实例共享,所以其中一个实例修改了,其他所有实例也会跟着变化
2).实例初始化无法传递参数,因为原型指向的是父类的构造函数,所以传参也没用

1).经典继承

通过apply,call继承父类原型,在子类原型中添加自己的属性

function SuperType(name){
    this.name = name;
}

function SubType(){
    //继承SuperType
    SuperType.call(this,"Tom");
    //自定义子类属性
    this.age = '29;
}

var instance = new SuvType();
alert(instance.age); //29
2).组合式继承

子类通过借用构造函数(applay,call)继承父类的实例属性的继承,通过原型链对原型属性和方法的继承
缺点:调用2次父类的构造函数

function SuperType(name){
    this.name = name;
}
SuperType.proptotype.sayName = function(){ alert(this.name) }

function SubType(){
    //继承SuperType的构造函数属性和方法
    //第二次调用SuperType
    SuperType.call(this,"Tom");
    this.age = '29;
}

//继承SuperType的原型链的属性和方法
//第一次调用SuperType()
subType.prototype = new SubperType();
subType.constructor = subType;
3).原型式继承

基于上一个实例封装,目得就是为了实例共享

var person = { name: "Nicholas", friends: ["Shelby", "Court", "Van"] };
var anotherPerson = Object( person); 

anotherPerson.name = "Greg"; 
anotherPerson.friends.push(" Rob");

//ES6新方法
var yetAnotherPerson = Object.create(person,
    {
        name: {value: "Linda"},
    }
);
console.log( anotherPerson.friends);//"Shelby, Court, Van, Rob, Barbie"
4).寄生式继承

原型式继承的改进。简单地给对象添加函数

var person = { name: "Nicholas", friends: ["Shelby", "Court", "Van"] };

function createAnother(original){ 
    var clone = Object(original); 
    //添加新方法,增强
    clone. sayHi = function(){alert(" hi"); }; 
    return clone;
}

var anotherPerson = createAnother(person); 
anotherPerson.sayHi(); //"hi"
5).寄生组合式继承

最终BOSS,解决伪继承的缺点,极组合式继承和寄生式继承优点

function inheritPrototype(subType, superType){ 
    //创建对象
    var prototype = Object(superType.prototype);  
    //增强对象 
    .....
    prototype.constructor = subType;
    //指定对象
    subType.prototype = prototype; 
}

function SuperType(name){
    this.name = name;
}
SuperType.proptotype.sayName = function(){ alert(this.name) }

function SubType(){
    SuperType.call(this,"Tom");
    this.age = '29;
}

//不直接new superType,而是浅复制它的原型
inheritPrototype(subType,superType)

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • Javascript继承的原理

    JavaScript的继承是通过原型链继承,与传统面向对象的继承方式不同。 prototype与原型 我们从头开始...

  • 原型与原型链以及继承

    今天复习下原型与原型链的知识,以及记录新学的继承知识点。 知识点纲要 原型与原型链 es5与es6继承 什么是原型...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • 原型与继承

  • 原型与继承

    1.js是通过原型链来实现继承 基本思想是利用原型的一个引用类型继承另一个引用类型的属性和方法。原型对象将包含一个...

  • 原型与继承

    什么是继承? 继承父级的属性和方法和共享(原型链)的属性和方法 组合继承 通过原型链继承共享的方法和属性;通过构造...

  • 关于继承

    继承的实现方法 属性拷贝 浅拷贝 深拷贝 原型继承 原型式继承 原型链继承 组合继承(深拷贝+优化后的原型式继承)...

  • 函数的原型对象

    什么是原型? 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承。 函数的原型...

  • js基础之实现继承的几种方式

    js 实现继承的方式有: 原型链继承; 构造函数继承; 组合继承(原型链继承 + 构造函数继承)(最常用);(原型...

网友评论

      本文标题:原型与继承

      本文链接:https://www.haomeiwen.com/subject/rfrwixtx.html