__proto__和prototype的一些发现

来源:互联网 发布:路由器测试软件 编辑:程序博客网 时间:2024/05/22 17:34

        首先记一些总结,任何一个对象在构造时都会有自动创建一个__proto__属性,同时这个对象不一定会有prototype属性。

        为什么说不一定‘会有’,而不是不一定会‘自动创建’,是因为prototype属性的存在和用户代码的结构有关,即:如果创建的对象有构造器,那么就会有prototype属性,

如果没有构造器则没有prototype属性。下面我说明一下怎样创建的对象算是有构造器的,怎样是没有构造器的。


创建一个具有构造器的对象:

var Person1 = function () {};

function Person2 () {};

console.log(Person1.prototype);
console.log(Person1.__proto__);
console.log(Person2.prototype);
console.log(Person2.__proto__);

会依次看到:

Object{}

function()

Person2{}
function()

也就是说,Person1.prototype和Person2.prototype都指向了自身.

但是其中有些疑点,Person2.prototype打印的是Person2{},Person1.prototype打印的为什么不是Person1{}呢。

这又扯到了俩种function定义的区别:var Person1 = function () {},这句话首先会在栈内存创建一个变量Person1={},然后给Person1引用堆中的一片内存,然后在引用的堆内存中建立一个瞎名function。

function Person2 () {},这句话则会直接在堆内存中的静态空间中创建一个名为Person2的function。



Function是顶级的构造器,Object.prototype是顶级的原型链。 也就是说:

一、Object.__proto__  === Function.__proto__ === Function.prototype === Function.constructor.__proto__ === Function.constructor.prototype          

       五者都指向同一块内存域,域内值为function Function () {}.

二、Object.prototype  === Function.__proto__.__proto__ === Function.prototype.__proto__ 三者都指向同一块内存域,域内值为function Object () {};

       它们三者不再拥有属性prototype 和 __proto__,而只拥有一个constructor的属性。

       同时说明了Function的__proto__ 属性和prototype属性是继承自Object的.

三、Object.prototype.constructor === Object,

       Object.prototype.constructor.prototype === Object.prototype;值为function Object () {};

       Object.prototype.constructor.__proto__ === Object.__proto__;值为function Function () {}.

       顶级原型链Object.prototype的唯一子属性constructor等于Object自己.

四、Object.constructor ===  Function.constructor;都为function

Object的构造器(Object.__proto__)是function Function () {}, Function 的构造器(Function.__proto__)也是function Function () {};

Object的原型(Object.prototype)是function Object () {}, Function 的原型(Function.prototype)是function Function () {};


0 0
原创粉丝点击