原型和原型链总结

本文概述了JavaScript中创建对象的三种方法:字面量、构造函数和Object.create,以及它们与原型、构造函数、实例之间的关系,包括原型链的概念、原型链上的继承和instanceof与constructor的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说到原型就要提到对象,创建对象的三种方式

方式一.字面量

var obj11 = {name: 'smyh'};
    var obj12 = new Object(name: `smyh`); //内置对象(内置的构造函数)

两只写法效果是一样的,第一种是字面量的写法,第二种是内置的构造函数

方式二.通过构造函数

    var M = function (name) {
        this.name = name;
    }
    var obj3 = new M('smyhvae');

方式三,Object.creat

var p = {name:'poetry'};
    var obj3 = Object.create(p);  //此方法创建的对象,是用原型链连接的

总结一下

var a={} 其实是var a=new Object()的语法糖

var a=[] 其实是var a-new Array()的语法糖

function Foo(){} 其实是var Foo=new Function()的语法糖

原型,构造函数,实例之间的关系

1.构造函数通过new生成实例

2.构造函数也是函数,构造函数的proprototype指向原型(所有的函数都有prototype,但实例没有)

3.原型对象中有constructor指向该原型的构造函数,

Foo.prototype.constructor===Foo //true

4.实例的_proto_属性指向原型

 所有的引用类型(数组,对象,函数)都有_proto_这个属性

原型链

任何一个实例,通过原型链,找到它上面的原型,该原型对象中的方法和属性,可以被所有的原型实例共享

Object是原型链的顶端

原型可以起到继承的作用。原型里的方法都可以被不同的实例共享

  //给Foo的原型添加 say 函数
  Foo.prototype.say = function () {
      console.log('');
  }

 在访问一个实例的时候,如果实例本身没找到此方法或属性,就往原型上找。如果还是找不到,继续往上一级的原型上找

用于判断实例属于哪个构造函数可以使用instanceof 

  • 注意1:虽然说,实例是由构造函数 new 出来的,但是实例的__proto__属性引用的是构造函数的prototype。也就是说,实例的__proto__属性与构造函数本身无关。
  • 注意2:在原型链上,原型的上面可能还会有原型,以此类推往上走,继续找__proto__属性。这条链上如果能找到, instanceof 的返回结果也是 true。
  • foo instance of Foo的结果为true,因为foo.__proto__ === M.prototypetrue
  • foo instance of Objecet的结果也为true,为Foo.prototype.__proto__ === Object.prototypetrue
  • foo.__proto__.constructor === M的结果为true,但是 foo.__proto__.constructor === Object的结果为false
  • 所以,用 consturctor判断就比用 instanceof判断,更为严谨。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值