关于 Object.create() 方法要注意的一点是,如果参数为 null 那么会创建一个空链接的对象,由于这个对象没有任何原型链,所以说它不具有任何原生的方法,也无法进行原型的判断操作,这种特殊的对象常被称作“字典”,它完全不会受原型链的干扰,所以说适合用来存储数据:
1 var obj = Object.create(null);
2 obj.x = 1
3
4 var bar = Object.create(obj);
5 bar.y = 2;
6
7 console.log(Object.getPrototypeOf(obj)); //null
8
9 console.log(Object.prototype.isPrototypeOf(obj)); //false
10
11 console.log(obj instanceof Object); //false
12
13 console.log(bar.x); //1
14
15 obj.isPrototypeOf(bar); //TypeError: obj.isPrototypeOf is not a function
16
17 /**
18 * 注意由于对象没有关联到 Object.prototype 上面,所以无法调用原生方法,但这并不影响此对象的关联操作。
19 */
原型链是 JavaScript 当中非常重要的一点,同时也是比较难理解的一点,因为其与传统的面向对象语言有着非常大的区别,但这是正是 JavaScript 这门语言的精髓所在,关于原型与原型链,我们需要知道以下这几点:
JavaScript 通过原型来实现继承操作;
几乎所有对象都有原型链,其末端是 Object.prototype;
原型链上的 [[getter]] 操作会遍历整条原型链,[[setter]] 操作只会针对于当前对象;
我们可以通过修改原型链上的方法来添加我们想要的操作(最好不要这样做);
关于 JavaScript 原型链,在一开始人们都称为“继承”,其实这是一种不严谨的说法,因为这不是标准的面向对象方法,不过初期人人常常这么理解。现在我往往称之为关联和委托,关联指的是一个对象关联到另一个对象上,而委托则指的是一个对象可以调用另一个对象的方法。
本篇文章均为个人理解,如有不足或纰漏,欢迎在评论区指出。