《JavaScript语言精粹》学习笔记(二)
-
继承
-
在基于类的语言中,对象是类的实例,类可以从另一个类继承,而继承和实例化其实是把类中的属性和方法全部复制过来,类和实例之间互不影响。
而JS是一门基于原型的语言,这意味着对象直接从其他对象继承 (与其说继承,不如说成是 委托关系 ——- 摘自《你不知道的JavaScript》上卷)
JS是一门弱类型语言,对于一个对象来说重要的是它能做什么,而不是从哪里来。
-
伪类
-
new关键字
当一个函数被创建时,Function 构造器产生的函数对象会运行类似这样的一些代码:
this.prototype = { constructor: this };
Function.method('new', function(){
var that = Object.create(this.prototype);
var other = this.apply(than, arguments);
return (typeof other === 'object' && other) || that;
});
伪类继承方法:
Function.method( "extend", function( Parent ){
this.prototype = new Parent();
return this;
} );
//用法:
var Cat = function( name ){
this.name = name;
}
.extend( Animal );
伪类继承的缺陷:无法访问父类的方法,只能访问父类.prototype的方法。 javascript有更多的选择来实现代码重用(比如 对象继承)。
-
对象说明符:
- 有时候构造器要接受一大堆参数,而要记住参数的顺序有些困难。在这种情况下,如果我们在编写构造器时让它接受一个简单的对象说明符,可能会更加方便。所以我们可以这样做:
var myObject= function({
name: n,
home: h
}) {
this.name = n;//这里的n其实就是 传入的对象.name
this.home = h;//同上
}
var newObject = new myObject ({
name: "aaa",
home: "localhost"
});
-
继承:
- 在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象。基于原型的继承相比基于类的继承在概念上更加简单:一个新对象可以继承一个旧对象的属性。
这里写代码片
var block = function() {
//记住当前作用域。
var oldScope = scope;
//构造一个包含了当前作用域中所有对象的新作用域(新作用域继承它的外部作用域中的值、方法)
scope = Object.create(scope);
//传递左花括号作为参数调用advance
advance('{'};
//使用新的作用域进行解析
parse(scope);
//传递右花括号作为参数调用 advance 并抛弃新的作用域,回复原来老的外部作用域
advance('}');
scope = oldScope;
}