Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
YvetteLau opened this issue Jun 27, 2019 · 7 comments
Open

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

YvetteLau opened this issue Jun 27, 2019 · 7 comments

Comments

@YvetteLau
Copy link
Owner

No description provided.

@into-piece
Copy link

寄生式继承

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

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

@yangyiqiqia
Copy link

寄生式继承:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。
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
缺点:无法做到函数复用

@yelin1994
Copy link

寄生式继承

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()

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

@jodiezhang
Copy link

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

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()

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

@YvetteLau
Copy link
Owner Author

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

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() 方法。在考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是一种有用的模式。

缺点:

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

@chongyangwang
Copy link

chongyangwang commented Jul 2, 2019

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

实现如下:

 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();

@MissNanLan
Copy link

  • 基本思想: 寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象
  • 优点: 在考虑对象不是自定义类型和构造函数的情况下,寄生式继承也是一种很有效的方式
  • 缺点:使用寄生式继承式为对象添加函数,不能够做到函数复用
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants