-
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
原型链继承的优缺点是什么?使用原型链继承实现 Dog 继承 Animal #34
Comments
原型继承
代码如下: function object(o){
function F(){};
F.prototype = o;
return new F();
};
var Animal = {
叫声: '嘤嘤嘤',
名字: '',
走路: function (方式) {
return 方式;
}
};
var Dog = object(Animal);
Dog['名字'] = '鹍鹍';
Dog['走路'] = function (方式) {
return '唱,' + 方式 + ',rap,打篮球';
}; |
一楼的对象真好 |
原型链继承的优点:1.引用类型的方法被所有实例共享,也就是说可以一个方法,写遍天下,哈哈。 原型链继承的缺点:1.优点也是缺点,子类实例共享属性,造成实例之间的属性会互相影响。 上代码:原型链继承
这种实现方式还请大佬指正下算是哪种
|
|
|
原型链继承的优缺点?
|
原型链继承
这是从《JavaScript 高级程序设计》中关于原型链的解释,简单说就是构造函数都有一个原型对象,实例包含原定对象的内部指针,如果让原型对象等于实例,就完成了原型链的继承。 // 构造函数
function Animal(name,six){
this.name = name;
this.six = six;
}
Animal.prototype.cry = function(){
return '嘤嘤嘤';
} 使用原型链继承,使原型对象等于实例。 function Dog(name,age){
this.name=name;
this.age = age;
}
Dog.prototype = new Animal('怪兽','未知');
Dog.prototype.run = function(){
return '鸭子类型';
}
// 完成实例化,检测继承
var erHa = new Dog('哈士奇', 5);
console.info(erHa.name); // => 哈士奇
console.info(erHa.six); // => 未知
console.info(erHa.age); // => 5
console.info(erHa.cry()); // => 嘤嘤嘤
console.info(erHa.run()); // => 鸭子类型 |
原型链继承的优缺点?
必须基于一个已有对象来实现,即必须有一个对象可以作为另一个对象的基础。
在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况,原型链继承是完全可以胜任的,不过要记得包含引用值的属性始终都会共享相应的值(就像上面的 |
刚看完书想写,上面老哥直接搬出来就不复述了。
|
原型链继承eg:
如上面代码所示:
|
原型链继承的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 function Animal(name, age) {
this.name = name;
this.age = age;
}
Animal.prototype.say = function() {
return this.name;
}
function Dog() {
}
//Dog的原型对象是 Animal 的实例
//Dog的原型对象具有 Animal 实例的所有属性和方法,其内部还有一个指针指向Animal的原型
Dog.prototype = new Animal('dog', 2);
Dog.prototype.bark = function() {
console.log('汪汪汪');
}
let Jack = new Dog();
引用类型的方法被所有实例共享。
|
原型链是实现继承的主要方法,其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。他的优点是可以实现对父级的复用,也正是因为子类间可以共享父类,因此属性间会相互影响。 |
继承是重要的基础知识,本周一起巩固~ |
原型链继承使用原型链继承实现Dog继承Animalfunction Animal(name) {
this.name = name;
}
Animal.prototype.getName = function() {
console.log(this.name)
}
function Dog() {
}
Dog.prototype = new Animal('hashiqi')
let hashiqi= new Dog(); 优缺点优点:父类方法得到了复用 |
原型链继承: 缺点
优点
Dog继承Animal function Animal(species) {
this.species = species;
}
Animal.prototype.getSpecies = function() {
return this.species;
}
function Dog() {
this.species = 'dog';
}
Dog.prototype = new Animal();
Dog.prototype.bark = function() {
console.log('waaaaaaaaa~');
}
let dog = new Dog();
console.log(dog.getSpecies()); // 'dog'
dog.bark(); // 'waaaaaaaaa~' |
ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。
原型链可以用来实现继承,但是也存在一些问题。
第二个问题,在创建子类型的实例时,不能向超类型的构造函数中传递参数。 |
function Animal(name) {
this.info = {
name,
};
}
Animal.prototype.sayName = function() {
console.log(this.info.name);
};
function Cat() {}
Cat.prototype = new Animal('xx');
let cat1 = new `Cat();`
let cat2 = new Cat();
console.log(cat1.info.name, cat2.info.name); // xx xx
cat1.info.name = 'yy'
console.log(cat2.info.name) // yy 缺点:如果存在父类属性是引用类型的,所有子类继承后,会相互影响;在 new 子类的时候,不能向父类传递参数。 |
原型链继承的优缺点是什么?优点:子能继承父的方法和属性,不需要重新写一遍,能增加代码的服用 使用原型链继承实现Dog继承Animal
|
function Animal(){
this.species = '哈士奇'
}
Animal.prototype.getSpecies = function(){
return this.species
}
function Dog(){
this.species = '阿拉斯加犬'; // 在子类改变了父类的属性
}
Dog.prototype = new Animal(); // 继承了Animal的属性和方法
var dog1 = new Dog();
var dog2 = new Dog();
console.log(dog1.getSpecies()); // 阿拉斯加犬
console.log(dog2.getSpecies()); // 阿拉斯加犬,所有实例都被实例改变了 · |
No description provided.
The text was updated successfully, but these errors were encountered: