Step-By-Step icon indicating copy to clipboard operation
Step-By-Step copied to clipboard

寄生式继承的基本思路是什么?有什么优缺点?

Open YvetteLau opened this issue 5 years ago • 7 comments

YvetteLau avatar Jun 27 '19 00:06 YvetteLau

寄生式继承

寄生式继承就是把原型式继承再次封装,然后在对象上扩展新的方法,再把新对象返回

function createAnother(original){
    var clone = Object.create(original);    //通过调用函数创建一个新对象
    clone.sayHi = function(){           //以某种方式来增强这个对象
        console.log("hi");
    };
    return clone;                    //返回这个对象
}
  • 优点:决子统一为原型式继承中返回的对象统一添加方法。
  • 缺点:没用到原型,无法复用。

into-piece avatar Jun 27 '19 11:06 into-piece

寄生式继承:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。 function createAnother(original){ Var clone = object(original); Clone.sayHi = function(){ Console.log(‘hi’); } Return false; } Var person = { Name:’yay’, Friends:[‘Sheryl ’,’court’,’van’] }; Var anotherPerson = createAnother(person); AntherPerson.sayHi(); //hi 缺点:无法做到函数复用

yangyiqiqia avatar Jun 27 '19 15:06 yangyiqiqia

寄生式继承

function Dog (obj) {
    function Animal () {}
    Animal.prototype = obj
    return new Animal()
}
const obj = {
    name: 'animal',
    age: [12, 13, 132]
}
function AddExtend (obj) {
    var dog = Dog(obj)
    dog.say = function () {
        console.log('旺旺')
    }
    return dog
}
const newDog = new AddExtend(obj)
newDog.say()

寄生式继承是在原生式继承的基础上,给对象增加一些额外的属性,方法等。

yelin1994 avatar Jun 28 '19 15:06 yelin1994

创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后像真的是它做了所有工作一样,返回对象。

function createAnother(original){
      var clone=Object.create(original)  //通过调用函数创建一个新的对象
      clone.sayHi=function(){  //以某种方式来增强这个对象
          console.log('Hi')
      }
      return clone  //返回这个对象
}
var person={
     name:"Jodie",
     friends:["a","b","c"]
}

var anotherPerson=createAnother(person)
anotherPerson.sayHi()

缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率。

jodiezhang avatar Jun 29 '19 08:06 jodiezhang

寄生式继承是与原型式继承紧密相关的一种思路。寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部已某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。

function createAnother(original) {
    var clone = object(original);//通过调用函数创建一个新对象
    clone.sayHi = function () {//以某种方式增强这个对象
        console.log('hi');
    };
    return clone;//返回这个对象
}
var person = {
    name: 'Yvette',
    hobbies: ['reading', 'photography']
};

var person2 = createAnother(person);
person2.sayHi(); //hi

基于 person 返回了一个新对象 -—— person2,新对象不仅具有 person 的所有属性和方法,而且还有自己的 sayHi() 方法。在考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是一种有用的模式。

缺点:

  • 使用寄生式继承来为对象添加函数,会由于不能做到函数复用而效率低下。
  • 同原型链实现继承一样,包含引用类型值的属性会被所有实例共享。

YvetteLau avatar Jun 30 '19 14:06 YvetteLau

原型式继承 是将传入的对象作为要返回对象的原型。 寄生时继承 是传入一个对象 在利用这个传入的对象 生成一个新的对象 在生成的新对象上面追加方法 最后返回此生成对象。

实现如下:

 function  createNewObj(obj){
   let newObj= object.create(obj)
   newObj.say=function(){
      console.log('js是世界上最好的语言')
   }
 }

 var obj = {
   name: 'jsvascript',
   prototypes:['原型式继承','寄生式继承','组合式继承','构造函数继承']
}

var example1 = new createNewObj(obj)
example1.say();

chongyangwang avatar Jul 02 '19 03:07 chongyangwang

  • 基本思想: 寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象
  • 优点: 在考虑对象不是自定义类型和构造函数的情况下,寄生式继承也是一种很有效的方式
  • 缺点:使用寄生式继承式为对象添加函数,不能够做到函数复用
function createDog(obj){
 var clone = Object(obj);
 clone.getColor = function(){
   console.log(clone.color)
 }
 return clone
}

var dog = {
 species: '贵宾犬',
 color: 'yellow'
}

var dog1 = createDog(dog);
dog1.getColor();  // yellow

MissNanLan avatar Jul 14 '19 04:07 MissNanLan