未分类

原型那点事儿(2)

我们知道对象有原型,但细心一点的童鞋会发现,原型还有__proto__属性,这是为啥呢,哈,我们来看看原型链

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Grandpa.prototype.lastName = "James";
function Grandpa(){

}
var grand = new Grand();
Father.prototype = grand;
function Father(){
this.name = 'LeBron'
}
var father = new Father();
Son.prototype = father;
function Son(){
this.hobby = "smoke";
}
var son = new Son();

我们打印son.lastName 会显示”James”,当然了,Grandpa.prototype绝不是终点,当我们打印Grandpa.prototype.__proto__时,会发现它指向Object.prototype,Object.prototype是原型链顶层

Object.create(原型)创建对象

eg:

1
2
3
4
5
var obj = {
name: "sunny",
age: 123
};
var obj1 = Object.create(obj);//将原型设为obj,因此obj1就有了name和age属性

绝大多数对象的最终都会继承自Object.prototype (√)
原因:

我们发现()中可以填null,当填入null时,该对象没有原型,__proto__这个属性,如果系统给了,你可以改,如果系统没给,手动添加无效

关于toString()这个方法

我们知道不同类型的变量调用toString()这个方法的返回值是不同的
1.num
2.boolean
3.object

以num为例,还原整个过程

1
2
3
4
5
6
var num = 123;
//num.toString(); --> new Number(num).toString();此时是在Number原型上找
//Number.prototype.toString = function(){...} 但是吧Number原型上并没有所以就顺着原型链继续找
//Number.prototype.__proto__ = Object.prototype; 此时Object原型上有toString方法了
//但是我们看到了,Obj和num调用toString()方法返回的东西不同,这就说明,Number重写了Object原型上的toString()方法
num.toString();//"123"

ps:有一点需要注意的是,document.write()这个方法在调用时,会默认调用toString()方法,因此如果写成如下形式,会报错,因为没有原型的obj没有toString()方法

1
2
var obj = Object.creat(null);
document.write(obj);//()中实际上是obj.toString()