Chow's Notes

关于js 继承

js是基于原型继承的语言,意味着对象(类对象)可以直接从其他对象继承属性,而不是基于类的,该语言是无类别的。

这偏离当今编程语言的主流,大多数语言继承都是基于类的,尽管原型继承有着强大的表现力,但并不被广泛理解。

js本身对其原型的本质也缺乏信心,所以提供了一套与基于类的语言类似的对象构建语法

 

js原型继承的动态本质,新的方法或属性被添加到类对象的原型时,将被反映到所有的实例上,即便这个实例在添加之前(这在其他语言里就是通过类来实现的,因此

js是基于原型的继承)

荷兰程序员Gabor de Mooij提出了一种不使用this和prototype,代码部署起来非常简单的新方法,他称这种方法为”极简主义法”(minimalist approach)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//js面向对象模拟,极简主义,避免使用prototype
var Cat={
CreatNew:function(name){
var cat={};
cat.name=name;
cat.say=function(){
alert("Hello world !"+this.name);
}
return cat;
}
};
//cat1=Cat.CreatNew("Tom");
//cat1.say();
//继承
var CfCat={
CreatNew:function(name,age){
var cat=Cat.CreatNew(name);
var myselfdata='私有数据';//私有属性
cat.age=age;
cat.sayage=function(){
alert("my age is "+this.age);
};
cat.getMySelfdata=function(){alert(myselfdata);};
return cat;
}
};
var cat2=CfCat.CreatNew("coofecat",22);
/*cat2.say();
cat2.sayage();
cat2.getMySelfdata();
alert(cat2.myselfdata);*/
//实例共享数据
var Person={
Gender:"男",
CreateNew:function(name){
var cat={};
cat.name=name;
cat.sayGender=function(){
alert(this.name+" is "+Person.Gender);
};
cat.changeGender=function(gender){
Person.Gender=gender;
};
return cat;
}
}
var p1=Person.CreateNew("jack");
var p2=Person.CreateNew("tom");
p1.sayGender();
p2.sayGender();
p2.changeGender("女");
p1.sayGender();
p2.sayGender();