这两天在看js继承方面,它不像OC那种传统的类继承。js继承方式还是挺多的。比如:原型继承、原型冒充、复制继承
原型继承
原型继承有点绕,js似乎没有类的概念,构造对象都是用的函数调用来实例化一个对象。函数都有一个prototype属性,如果要继承可以用函数的prototype属性来赋值父类的一个实例,这样就拥有父类的属性和方法
<script>
function Cat () {
this.climb = function () {
alert("爬树");
}
}
function Tiger() {
this.eat = function () {
alert("吃肉");
}
}
function Animal() {
this.breath = function () {
alert("呼吸");
}
}
Tiger.prototype = new Cat();
var tiger = new Tiger();
tiger.eat();
tiger.climb();
console.log(tiger.__proto__);
console.log(tiger.__proto__.__proto__);
console.log(tiger.__proto__.__proto__.__proto__);
console.log(tiger.__proto__.__proto__.__proto__.__proto__);
var ani = new Animal();
console.log(ani.__proto__);
Tiger.prototype = ani;
tiger = new Tiger();
tiger.breath();
tiger.eat();
function All() {
this.say = function () {
alert("say");
}
}
Animal.prototype = new All();
ani = new Animal();
ani.say();
</script>
原型冒充
注意call的用法
<script>
function Good() {
this.goodStudy = function () {
console.log("好好学习");
console.log(this);
}
}
function Bad() {
Good.call(this);
this.badPlay = function () {
console.log("就会玩");
}
}
var bad = new Bad();
bad.badPlay();
bad.goodStudy();
</script>
复制继承
<script>
function Good() {
this.iq = 120;
this.goodStudy = function () {
console.log("好好学习");
}
}
function Bad(obj) {
this.badPlay = function () {
console.log("就会玩");
}
this.extend = function (obj) {
for (var k in obj){
this[k] = obj[k];
}
}
}
var good = new Good();
var bad = new Bad();
bad.extend(good);
bad.goodStudy();
console.log(bad.iq);
</script>
这里面遇到一个问题,在循环遍历extend函数的时候,访问对象属性用的“[ ]”,如果用“.”会报错,其实js对象属性有两种访问形式:“.”和“[ ]",两个有区别,性能方面“.”更高一些。
Obj.key 和 Obj[key] 我的通俗理解: 1、当对象的属性key不确定而是一个变量的时候必须使用[] 2、[]里可以是任意字符串,而. 不能随便 3、使用. 号key可不加引号, 使用[] key有时候需要加引号。
嗯,就写到这里