粗解构造函数,原型,原型链,显式原型,隐式原型

  1. 构造函数
  1. 引入:使用工厂函数来创造对象时,使用var obj =new Object(),创建后都是object,无法区分
  2. 创建一个构造函数,专门用来创建特定类型的对象,例如人的对象,动物的对象。构造函数就是一个普通的函数,创建方式和普通函数没有差别,不同的是构造函数习惯上要大写
  3. 构造函数和普通函数的区别就是调用方式的不同,普通函数直接调用,而构造函数需要使用new关键字来调用
function Person(){

this.name = “孙悟空”;

this.age = 18;

this.sayName = function (){

Console.log(this.name)

}

}

var per = Person() //作为普通函数调用没有返回值,’undefined’

var per = new Person() //作为构造函数调用。’[object,object]’
  1. 构造函数的执行流程:
  1. 立刻创建一个新的对象
  2. 将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对 象
  3. 逐行执行函数中的代码
  4. 将新建的对象作为返回值返回
  1. 使用同一构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类

                        构造函数 = 类

                        我们将通过一个构造函数创建的对象,称为是该类的实例

  1. 使用instanceof可以检查一个对象是否是一个类的实例,值得一提的是所有对象作 instanceof object 都为真

                语法:

                        对象 instanceof 构造函数

                        为真返回true,反之false

  1. 函数的prototype属性(我们所创建的每一个函数,解析器都会向函数中添加一个 prototype属性)
  1. 每个函数都有一个protoytpe属性,他默认指向一个object空对象(即为原型对象)
  2. 原型对象中有一个属性constructor,它指向函数对象
  3. 如果函数作为普通函数调用,prototype没有任何作用
  4. 当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性

        指向该构造函数的原型对象,我们可以通过__proto__来访问该属性

function Person(){

this.name = “孙悟空”;

this.age = 18;

this.sayName = function (){

Console.log(this.name)

}

}

var per1 = new Person()

var per2 = new Person()

per1.__proto__ == per2.__proto__ == Person.prototype//为true

也就是说通过构造函数(类)创建的同一个类下的所有实例的__proto__都指向这个构造函数(类)的原型对象(见下图)

  1. 给原型对象添加属性(一般都是方法)

作用:函数的所有实例对象自动拥有原型中的属性(方法)

原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中

当我们访问对象的一个属性或方法时:

他会在对象自身中寻找,如果有直接使用

如果没有则会去原型对象中寻找,如果找到则直接使用

如果没有则去原型的原型中寻找,直到找到object对象的原型

Object对象的原型没有原型,如果在object中依然没有找到,则返回undefined(如果找的是原型,就返回的是null),这也就是原型链的原理

函数.prototype.sayName = function(){

Console.log(this.name)

}

per1.sayName()

Per2.sayName()

Per3.sayName()

即使在对象以及构造函数中没有写sayName(),此时也可以调用,虽然在构造函数中写方法,也可以实现,但每创建一个对象就需要创建一个对应的函数方法,不够高效,所以一般来说公用的方法就放在原型对象上

我的理解:通过protoytpe向原型对象上添加方法,这样在通过原型对象来实例化一个新对象时,就可以让这个新对象具有这个方法(有点继承的意思),也有点像vue中的全局事件总线,在给vue原型上添加eventbus,使得每一个组件都具有这个属性并通过$emit,$on来操作数据

显示原型与隐式原型

  1. 每个函数function都有一个prototype,即显式原型(属性)
  2. 每个实例对象都有一个_proto_,可称为隐式原型(属性)
  3. 对象的隐形原型的值为其对应构造函数的显式原型的值
  4. 如上图
  5. 总结:
  1. 函数的prototype属性:在定义函数时自动添加的,默认值是一个空object对象
  2. 对象的_proto_属性:在创建对象时自动添加的,默认值为构造函数的prototype属性值
  3. 程序员可以直接操作显式原型但不可以直接操作隐式原型
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值