Skip to main content

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,前者为自己服务即