发布于 2016-10-09 09:38:32 | 80 次阅读 | 评论: 0 | 来源: 网友投递
这里有新鲜出炉的Javascript教程,程序狗速度看过来!
JavaScript客户端脚本语言
Javascript 是一种由Netscape的LiveScript发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这是一篇关于JavaScript的面向对象和继承的文章,写于1年前,作者循序渐进,对想学习JavaScript中面向对象的同学来说是很有帮助的,因此试着翻译一下,不妥之处,请指正。原文链接Objects and Inheritance in Javascript
虽然一些Javascript用户可能永远也不需要知道原型或面向对象语言的性质,但是那些来自传统面向对象的语言的开发者使用的时候会发现JavaScript的继承模型非常的奇怪。而不同的JS框架提供了各自的方法来编写类面向对象(class-like)的代码,这使得JS的面向对象更加的难以理解。这样带来的结果是:
1、没有一个标准的方法来实现面向对象。
2、JS面向对象的底层概念并没有得到人们的熟知
原型继承
原型继承是一个非常简单的概念,它的本质是:
1、对象a继承自对象b,就说b是a的原型(prototype)。
2、a继承了b的所有的属性,即如果b.x的值为1,那么a.x的值为1
3、a自身的属性会重写b中同名的属性
让我们在具体的代码中看看效果,假设有一个John Smith和一个继承自他的Jane。
var john = {firstName: 'John', lastName: 'Smith'};
var jane = {firstName: 'Jane'};
jane.__proto__ = john;
jane.lastName
"Smith"//该属性继承自john
jane.firstName;//该属性覆写了john中的firstName属性
"Jane"
john.hair = 'brown'; //给john添加一个新属性
jane.hair;
"brown"//结果表明jane继承了新添加的属性
jane.lastName = 'Doe'
jane.lastName
"Doe"
delete jane.lastName
该属性的值就会恢复为john的值
[code]
jane.lastName
"Smith"
john.__proto__;
Object { }
function Cat(name){ // <-这是一个常规的函数
this.name = name // this指向新建的对象
}
Cat.prototype
Cat { }
var garfield = new Cat('Garfield') // 创建一个实例 - Cat函数充当了构造函数
garfield.__proto__ === Cat.prototype
true //看到了吗? `Cat.prototype` 现在是garfield对象的原型
Cat.prototype.greet = function(){
console.log('Meow, I am ' + this.name)
}
garfield.greet()
"Meow, I am Garfield"
var felix = new Cat('Felix')
felix.greet()
"Meow, I am Felix"
garfield.greet = function(){
console.log("What's new?");
};
garfield.greet();
"What's new?"
felix.greet();
"Meow, I am Felix"
function Animal(){
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat // 让`Cat.prototype` 知道它是Cat的一个实例
Animal.prototype.breed = function(){
console.log('Making a new animal!');
return new this.constructor();
};
var kitty = garfield.breed();
Making a new animal!