浅谈JavaScript对象的原型prototype

前提:

        在JavaScript中一切皆对象,分为普通对象和函数对象,每个对象都有原型(undefined和null没有原型,所以undefined和null也就没有toSting方法)。

Object:Object是一个函数对象,Object的原型就是Object。prototype,它里面存在着一些对象的方法和属性,例如最常见的toString方法。

普通对象:用new Object或者{}建的对象是普通对象,它没有prototype属性,只有__proto__属性,它指向Object.prototype。

Array:Array也是一个函数对象,它的原型就是Array.prototype,它里面存在着一些数组的方法和属性,例如常见的push,pop等方法。

Function:Function也是一个函数对象,它的原型就是一个function空函数。

自定义函数:它的原型就是你给指定的内容。如果不指定,那它的原型就是一个Object.prototype,例:function Test(){}; Test.prototype = {name:"张三"};var test = new Test();此时Test的原型就是Test.prototype 。

1.prototype定义:

原型是function对象的一个属性,它定义了构造函数制造出来的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。

对象的原型:__proto__

注:对象分为function1对象和Object对象,每个对象都有原型(null和undefined除外,unll和undefind不可以用toString方法)

例1:person和person1它们的共有祖先为Person.prototype

function Person (){

}

var person = new Person();

var person1 = new Person();

例2:自己身上有属性,原型上也有属性,取自己身上的,就近原则

Person.prototype.name = "张三";

   function Person (){

this.name = "李四"

}

var person = new Person();

console.log(person.name) //--->李四

例3:可以通过对象改变自己的属性,但是对原型无效,原型属性不可以被对象修改。

例4:请关注属性颜色,浅紫色是系统设置的属性,深紫色是自己设置的属性,__proto__是系统隐式的属性,可以改,但是尽量别改,一般这样的命名代表不希望被修改,例如:_private

注:当你访问一个对象属性时,如果这个对象没有这个属性,就会访问proto这个索引,查找proto里是否有你想要的属性。

有构造函数的情况,每当执行到new关键词时,会在最前面隐式执行var this = {__proto__:Person.prototype}

最后隐式执行 return this

例5:当执行 Person.prototype = {name:"李四"}时,person 已经被定义并且构造了对象,即已经new了,此时person.name继承的是构造函数Person.prorotype.name,所以后定义的Person.prototype = {name:""}还没有覆盖原来的Person.prototype.name ,因此,执行结果为:张三

Person.prototype.name = "张三";

    function Person (){

        //var this = {__proto__:Person.prototype}   隐式执行

        // this.name = "李四"

    }

var person = new Person();

Person.prototype = {

    name : "李四"

}

console.log(person.name)

例6:Person.prototype.name = "小刘",这种写法是在原来的对象上改变属性值,Person.prototype = {name:"李四"},这种写法是把原型改了,换了个新对象,如下代码,Person.prototype.name = "小刘" 是把原来的“张三”改成了“小刘”,而Person.prototype = {name:"李四"}保留原来的Person.prototype.name = "张三",同是又新健了一个同名对象为Person.prototype.name,这个的是是“李四”

  

Person.prototype.name = "张三";

    function Person (){

        //var this = {__proto__:Person.prototype}   隐式执行

        // this.name = "李四"

    }

    Person.prototype.name = "小刘"

    var person = new Person();

    Person.prototype = {

        name : "guojia"

    }

    console.log(person.name)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端菜鸟小郭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值