Step-By-Step
Step-By-Step copied to clipboard
寄生式继承的基本思路是什么?有什么优缺点?
寄生式继承
寄生式继承就是把原型式继承再次封装,然后在对象上扩展新的方法,再把新对象返回
function createAnother(original){
var clone = Object.create(original); //通过调用函数创建一个新对象
clone.sayHi = function(){ //以某种方式来增强这个对象
console.log("hi");
};
return clone; //返回这个对象
}
- 优点:决子统一为原型式继承中返回的对象统一添加方法。
- 缺点:没用到原型,无法复用。
寄生式继承:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。 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 缺点:无法做到函数复用
寄生式继承
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()
寄生式继承是在原生式继承的基础上,给对象增加一些额外的属性,方法等。
创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后像真的是它做了所有工作一样,返回对象。
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()
缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率。
寄生式继承是与原型式继承紧密相关的一种思路。寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部已某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。
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()
方法。在考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是一种有用的模式。
缺点:
- 使用寄生式继承来为对象添加函数,会由于不能做到函数复用而效率低下。
- 同原型链实现继承一样,包含引用类型值的属性会被所有实例共享。
原型式继承 是将传入的对象作为要返回对象的原型。 寄生时继承 是传入一个对象 在利用这个传入的对象 生成一个新的对象 在生成的新对象上面追加方法 最后返回此生成对象。
实现如下:
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();
- 基本思想: 寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象
- 优点: 在考虑对象不是自定义类型和构造函数的情况下,寄生式继承也是一种很有效的方式
- 缺点:使用寄生式继承式为对象添加函数,不能够做到函数复用
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