/**
* 来自<<javascript 模式>>
*
* 本人学习时整理了一遍
*/
/**
* 类继承模式-默认模式
*/
function inherit (C, P) {
C.prototype = new P;
}
//父构造函数
function Parent(name) {
this.name = name || "Adam";
}
//往父类构造函数的原型上添加一个方法
Parent.prototype.say = function() {
return this.name;
}
//子类构造函数
function Child(name) {
this.name = name;
}
inherit(Child, Parent);
var cd = new Child('Tina');
console.log(cd.say());
/**
* 类继承模式-借用构造函数
* 该模式只能继承父类构造函数中添加到this的属性,不能继承来自原型的属性和静态属性。
//实现构造函数继承的核心方法
function Child(name) {
Parent.apply(this, arguments);
this.name = name;
}
*/
//父构造函数
function Article() {
this.tags = ['js', 'css'];
}
var article = new Article();
function BlogPost() {}
BlogPost.prototype = article;
var blog = new BlogPost();
function StaticPage() {
Article.call(this, arguments);
}
var page = new StaticPage();
console.log(article.hasOwnProperty('tags'));
console.log(blog.hasOwnProperty('tags'));
console.log(page.hasOwnProperty('tags'));
//借用构造函数实现多重继承
function Cat() {
this.legs = 4;
this.say = function() {
return "meaowww";
}
}
function Bird() {
this.wings = 2;
this.fly = true;
}
function CatWings() {
Cat.apply(this);
Bird.apply(this);
}
var jane = new CatWings();
console.dir(jane);
/**
* 借用父类的构造函数,并设置子类的原型属性,实现近乎最接近传统继承的摸型.
* 当然,在javascript会带来其它的问题。
*/
function Parent(name) {
this.name = name || "Adam";
}
Parent.prototype.say = function() {
return this.name;
}
function Child(name) {
//借用构造函数
Parent.apply(this,arguments);
}
//设置原型
Child.prototype = new Parent();
var kid = new Child('mtima');
console.log(kid.name);
console.log(kid.say());
/**
* 类继承模式-临时构造函数
* 这可以避免默认模式带来的父类this上的属性问题
* 更安全,效率也更高
*/
function inherit(C,P) {
var F = function() {}
F.prototype = P.prototype;
C.prototype = new F;
/**
* 我们还可以设置一个指向父类prototype的引用
* 实现类似php中调用父类的parent关键字的功能
*/
C.uper = F.prototype;
}
//父构造函数
function Parent(name) {
this.name = name || "Adam";
}
//往父类构造函数的原型上添加一个方法
Parent.prototype.say = function() {
return this.name;
}
Parent.prototype.getAge = function() {
return this.age;
}
//子类构造函数
function Child(age) {
this.age = age;
}
//实现临时构造函数
inherit(Child, Parent);
var kid = new Child(20);
console.log(kid.name);
console.log(kid.say());
console.log(kid.getAge());