-
Notifications
You must be signed in to change notification settings - Fork 66
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
原型式继承的基本思想是什么?有什么优缺点? #36
Comments
思想: 借助原型基于已有的对象创建新的对象,同时不需要创建自定义类型。 function inherit(o) {
function F() {}
F.prototype = o;
return new F();
} 从上面的代码可以看出来,如果传入inherit函数的对象包含一个引用类型的值,那么修改这个新创建的对象继承来的这个值会影响传入的这个对象,因此通过这个对象创建的其他的新对象也会受到影响。 function inherit(o) {
function F() {}
F.prototype = o;
return new F();
}
let o = {
name: 'test',
friends: ['a', 'b']
}
let a = inherit(o);
let b = inherit(o);
a.friends.push('c');
console.log(a.friends); // [ 'a', 'b', 'c' ]
console.log(b.friends); // [ 'a', 'b', 'c' ] |
原型式继承
缺点:
|
原型式继承就是将传入的对象作为创建对象的原型,模拟Object.create()实现。 function createObj(o) {
function F(){}
F.prototype = o;
return new F()
}
var obj = {
name: 'zhangsan',
colors: ['red', 'blue']
}
let o1 = createObj(o);
o1.name = 'lisi';
o1.colors.push('green');
let o2 = createObj(o);
console.log(o1.name, o1.colors); // 'lisi', ['red', 'blue', 'green']
console.log(o2.name, o2.colors); // 'zhangsan', ['red', 'blue', 'green']
优缺点: |
原型式继承
优点是这种继承借助原型并基于已有的对象创建新对象,同时还不必因此创建自定义类型 |
基本思想是让一个原型对象指向另一个类型的实例 |
其大致是用Dog 返回一个包装,对象。Dog 以 obj 为模板,定义一个Animal的函数,使Animal 指向模板,这样就能使 new Animal的对象,能够使用obj里面的私有属性, 但同时他又是一个浅拷贝,复杂的数据类型,会被多个对象共用,毕竟复杂对象,栈中存放的是堆的地址 |
原型式继承的基本思想是:借助原型可以基于已有的对象创建新对象。其本质是执行对给定对象的浅拷贝。 Console.log(person.friends);//Shelby,court,van,Rob,Barbie 缺点:包含引用类型值的属性始终都会共享相应的值。 |
原型式继承
相当于创建了person对象的副本。
缺点:仍然和原型链继承的缺点一样,引用类型对于新的实例会跟着改变。 |
原型式继承
|
原型式继承:先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例`` |
原型式继承原型式继承的思想是借用原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型.
优点:每个新创建的实例可以共享属性,减少内存消耗 |
function object(o){
function F(){}
F.prototype = o;
return new F();
}
var dog = {
species: '比熊犬',
color: 'gold',
skills: ["jump","climb","catch","run"]
}
var dog1 = Object(dog); // dog 对象作为dog1 对象的基础,在ES5当中,这里可以写成Object.create
dog1.species = ' 泰迪';
dog1.color = 'brown';
dog1.skills.push('acting');
var dog2 = Object(dog);
dog2.species = ' 吉娃娃';
dog2.color = 'grey';
dog2.skills.push('show');
skills: ["jump","climb","catch","run"];
console.log(dog.skills); // ["jump", "climb", "catch", "run", "acting", "show"]
console.log(dog.species); // 吉娃娃 |
No description provided.
The text was updated successfully, but these errors were encountered: