05.原型链
1 什么是原型链?
在javascript
声明一个变量,会自动继承一些属性和方法,这些都包含在__proto__
属性和__proto__
的__proto__
中,从而定义好一个变量后,就能去使用它,如字符串的长度属性length
,拼接的对象的方法concat
等。而这些额外的属性和方法就是原型链了。那有没有纯粹的变量,没有原型链的?有的!
用let foo = Object.create(__proto__: object, {} :boject) : object
的方式可以定义一个无原型的对象(完全数据字典对象),如:
let foo = Object.create(null, {
name: {
value: "hello world"
}
}) : object
console.dir(foo);
// {name: "hello world"}
2,重写属性和方法
原型链上的属性和方法在对象变量进行优先调用,如:
let Foo = {
hasOwnProperty: function() {
console.dir("transer hasOwnProperty method");
}
}
Foo.hasOwnProperty(); // transer hasOwnProperty method
Foo.__proto__.hasOwnProperty('name'); // false
3 函数prototype
属性说明
javascript
的函数可以当既可以当函数来用,也可以当一个类的实例和初始化方法来用,而它有一个属性为prototype
,当实例化后,这个属性就会等于下游实例化后的对象变量的__proto__
属性。从而上游修改prototyp
,尽管下游已经实例的内置属性和方法也会跟着改变。如:
function foo() {}
let Bar = new foo();
foo.prototype.show = function () {
console.dir('hello world !');
}
Bar.show();// hello world !
4 原型链的长度和组成
在javascript
的所有数据类型都可以看成对象,如:
// 对象
let Obj = new object();
// 字符串对象
let Str = new string();
// 布尔对象
let Bool = new boolean();
// 正则对象
let Reg = new RegExp();
// 数组对象
let Arr = new Array();
而每个对象或许都有2个属性__proto__
和prototype
,前者为自己服务即