// 1.原型链
function Person() {this.name = 'Tom'};
Person.prototype.sayName = function () {alert('hello')};
function Person1() {}
Person1.prototype = new Person();
var person = new Person1();
//引用类型会在原型链上共享,不能给Person传参数
//2.借用构造函数
function Person(name) {this.name = name};
Person.prototype.sayName = function () {alert('hello')};
function Person1(name) {
Person.call(this,'Tom')
}
var person = new Person1();
//构造函数实现的继承,也可以传参,函数可复用性没有体现
//3.组合继承
function Person(name) {this.name = name};
Person.prototype.sayName = function () {alert('hello')};
function Person1(name) {
Person.call(this,'Tom')//第二次调用
}
Person1.prototype = new Person();//第一次调用
Person1.prototype.constructor = Person1;
var person = new Person1();
//原型上增加了无用属性,且每次new实例会调用两次Person
//4.原型继承
function object(o) {
function F() {};
F.prototype = o;
return new F();
}
var obj = {
name: 'Tom',
arr: [1,2,3]
}
//或者使用ES5 Object.create(obj)原理一样
// var test = Object.create(obj)
var test = object(obj);
//继承了obj对象,函数复用性低,缺点和原型链继承一样,引用类型的属性值会被实例共享
//5.寄生式继承
function object(o) {
function F() {};
F.prototype = o;//{}
return new F();
}
var obj = {
name: 'Tom',
arr: [1,2,3],
}
function sayName(o) {
var clone = object(o);
clone.sayName = function() {alert('hello')};
return clone;
}
//或者使用ES5 Object.create(obj)原理一样
//var test = Object.create(obj)
var test = sayName(obj);
//在主要考虑对象而不是自定义类型或构造函数的情况下,可以使用
//函数可复用性没有体现
//6.组合寄生继承
function Person(name) {
this.name = name;
}
function chill(name) {
Person.call(this,name);
}
Person.prototype.sayName = function() {alert('hello')}
function cons(chil,supe) {
var prototype = object(supe.prototype);
prototype.constructor = chill;
chil.prototype = prototype;
}
cons(chill,Person);
var test = new chill('tom');
寄生组合式继承:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法.
思路:不必为了指定子类的原型而调用父类的构造函数,我们所需要的无非就是父类原型的一个副本而已.
本质上,就是使用寄生式继承来继承父类的原型,然后在将结果指定给子类的原型:
js继承的六种方式
最新推荐文章于 2023-06-27 17:16:37 发布