js 原型

1. 什么是原型?

我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个对象,

它的用途是包含有特定类型的所有实例共享的属性和方法。

 

2. 只要创建了一个新函数,就会为该函数创建一个prototype属性。

在默认情况下,所有prototype属性都会自动获得一个constructor(构造函数)属性,

这个属性包含一个指向prototype属性所在函数的指针。

这样,函数及函数原型之间形成了循环指向。

 

3. 每当调用构造函数创建一个新实例后(即"new constructor()"这样的形式),

该实例的内部将包含一个指针(一般名为__proto__),指向构造函数的原型属性。

 

4.当调用一个对象的属性或者方法时,会先在this的内部查找(也就是构造函数内部),如果没有找到然后再沿着原型链向上追溯。

 

说明

一、 Prototype__proto__ObjectFunction关系介绍

说明:

http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html

Function、Object:Js自带的函数对象。

        prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型(Function.prototype函数对象是个例外,没有prototype属性)。

        __proto__:每个对象都有一个名为__proto__的内部隐藏属性,指向于它所对应的原型对象(chrome、firefox中名称为__proto__,并且可以被访问到)。原型链正是基于__proto__才得以形成(note:不是基于函数对象的属性prototype)。

1、Function跟Object本身也是函数对象

2、所有对象,包括函数对象的原型链最终都指向了Object.prototype,而Object.prototype.__proto__===null,原型链至此结束。

3、Animal.prototype是一个普通对象。

4、Object是一个函数对象,也是Function构造的,Object.prototype是一个普通对象。

5、Function.prototype 是一个函数对象,前面说函数对象都有一个显示的prototype属性,但是Function.prototype却没有prototype属性,即 Function.prototype.prototype===undefined,所有Function.prototype函数对象是一个特例,没 有prototype属性。

6、Object虽是Function构造的一个函数对象,但是Object.prototype没有指向Function.prototype,即Object.prototype!==Function.prototype。

 

二、PrototypeConstructor关系介绍

 在 JavaScript 中,每个函数对象都有名为“prototype”的属性(上面提到过Function.prototype函数对象是个例外,没有prototype属性),用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用(i.e. Animal.prototype.constructor===Animal)。

 

 

onsole.log('anim.constructor===Animal:'+(anim.constructor===Animal))    ;    //true
    console.log('Animal===Animal.prototype.constructor:'+(Animal===Animal.prototype.constructor))    ;    //true
    console.log('Animal.constructor===Function.prototype.constructor:'+(Animal.constructor===Function.prototype.constructor));   //true
    console.log('Function.prototype.constructor===Function:'+(Function.prototype.constructor===Function));    //true
    console.log('Function.constructor===Function.prototype.constructor:'+(Function.constructor===Function.prototype.constructor));    //true

    console.log('Object.prototype.constructor===Object:'+(Object.prototype.constructor===Object));    //true
    console.log('Object.constructor====Function:'+(Object.constructor===Function));    //true

上图中,红色箭头表示函数对象的原型的constructor所指向的对象。

1、注意Object.constructor===Function;本身Object就是Function函数构造出来的        

2、如何查找一个对象的constructor,就是在该对象的原型链上寻找碰到的第一个constructor属性所指向的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值