nodejs继承的用法

对于上一篇,最后不明白的那块内容,今天在看Object.assign这个Polyfill实现里面有个方法
defineProperty方法,里面也有

1
2
3
4
5
6
{
enumerable: false,
configurable: true,
writable: true,
value:function(){...}
}

解释如下:

configurable

当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 false。

enumerable

true 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。
数据描述符同时具有以下可选键值:

value

与属性相关的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

writable

true 当且仅当可能用 赋值运算符 改变与属性相关的值。默认为 false。

另外,Object.create也有说明,create方法的第二个参数的说明:

propertiesObject

一个对象值,可以包含若干个属性,属性名为新建对象的属性名,属性值为那个属性的属性描述符对象.

第一次接触node继承,是在使用events.EventEmitter时接触的。
代码如下:

1
2
3
4
5
6
7
8
var util = require("util");
var events = require("events");//EventEmitter通过events模块来访问
function MyStream() {//新建一个类
events.EventEmitter.call(this);
}
util.inherits(MyStream, events.EventEmitter);

为什么需要Call父级构造函数呢?inherits方法无法继承父级构造函数的成员方法和变量吗?
是的,inherits方法只是把子级的构造函数的原型指向了父级的原型,也就是说,不是父级实例化后的对象
所以没有父级构造函数的成员。

这样的好处是继承的方法只是继承了父级在prototype可以共享的方法和属性,降低了原型链的继承查找。
call则直接指向了父级构造函数,当实例化子级构造函数时,将父级的构造过程运用于子级。

和之前讲的混合方式有点类似,但是从出发点来讲,
更清晰的区分了冒充和原型的信息共享。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function A() {
this.a = 123;
}
A.prototype.say = function() {
return this.a;
}
function B() {
this.b = 456;
}
B.prototype = A.prototype;
var b = new B;
console.log(b.say());//undefined