关闭搜索(ESC)
搜索标签:

原型和原型链

2015-11-09 浏览:750 标签: 原型链 原型 js

宇宙大爆炸,来一个

讲到js,首先要讲一个原型和原型链的东西。在js的世界里,所有都是对象,但是主要分两个,函数对象,和普通对象。

函数对象和普通对象

var f1 = function() {
   console.log('hello world');
}

var o1 = new f1();

console.log(typeof f2);
console.log(typeof o1);

结果是:

hello world
function
object

就是说只要new Function()的都是函数对象。

现在问题来了,在js里有一个二元运算符,instance

那么,我们再来了解一下原型链。

原型链

// 创建一个通用构造器Foo
function Foo() {
}
// 创建一个Foo的实例
var foo = new Foo();

// foo是Foo的一个实例,返回true
alert(foo instanceof Foo);// true 
// foo同样是一个对对象
alert(foo instanceof Object);// true

// foo的原型链
//
//      __proto__                   __proto__                     __proto__
// foo -----------> Foo.prototype -----------> Object.prototype -----------> null

// 但是foo却没有函数对象,不在函数原型里
alert(foo instanceof Function);// false

// 但是foo的构造者Foo却是一个函数对象
alert(Foo instanceof Function);// true
// 所以Foo也是一个对象
alert(Foo instanceof Object);// true

// Foo的原型链
//
//      __proto__                        __proto__                      __proto__
// Foo -----------> Function.prototype -----------> Object.prototype -----------> null
B instanceof A     // true or false

如果B在A的原型链被发现,那么,返回true,否则false

Function instanceof Object? Object instanceof Function?

现在,我们来玩一下:

console.log(Function instanceof Object) // true
console.log(Object instanceof Function)  // true

结果是什么呢?都是返回true。这是为什么呢?这就要追溯到原型链的问题了。我们来看一张图,我盗的:

那么为什么返回true呢?因为Array,Object和Function都被称作构造函数,都是所谓的函数,而所有的函数都是函数对象的实力,所以Object instanceof Function,而Function.prototype又是一个对象,他的构造函数就是Object,所以Object instanceof Function

总结

现在,我们得出一个结论:

在js的世界里,一切都是对象,全部继承自Object,或者更确切的说是Object.prototype

添加评论