js中的显式原型和隐式原型

显式原型:prototype

隐式原型:__ proto__

1.显式原型和隐式原型是什么

在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__ proto__)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型 (prototype)。

方法(Function)是一个特殊的对象,除了和其他对象一样具有__proto__属性以外,它还有一个自己特有的原型属性(prototype),这个属性是一个指针,指向原型对象。原型对象也有一个属性叫constructor,这个属性包含一个指针,指向原构造函数。

注意:通过Function.prototype.bind方法构造出来的函数没有prototype属性。

注意:Object.prototype.这个对象的是个例外,它的__proto__值为null。

2.二者的关系
隐式原型指向创建这个对象的构造函数的prototype
3.二者的区别
prototype:专属于函数的一个属性,类型为对象,叫原型对象;
作用:为了给将来自身所在的构造函数被new出来的实例做父级使用的
__ proto__:专属于对象数据的一个属性,类型为对象,叫隐士原型,
作用:找父级
特性:
a.当某个对象自身不具有某个属性或方法时,会找父级
b.当这个对象是被new出来的实例时,这个对象的父级(__ proto__)就是当前被new出来的构造函数的prototype
下面来看一下一些常用的创建对象的方法
 通过字面量的方式创建:
var obj = {name:“admin”};
obj.age = 18;
 通过内置构造函数的方式创建
var obj1 = new Object();
obj1.name = “root”;
以上两种创建对象的方式的缺点是:在创建多个对象时,会产生大量的重复代码
 通过自定义构造函数的方式创建
自定义构造函数的基础语法:
function createPerson(n,a,s){
this.name = n;
this.age = a;
this.sex = s;
this.sayHello = function(){
console.log(this.name + “—” + this.age);
}
}
var p1 = new createPerson(“zhangsan”,15,“男”);
console.log(p1);
p1.sayHello();
案例:
在这里插入图片描述
执行结果:
在这里插入图片描述
new是一个执行关键字
new关键字的内部执行原理:
a、自动创建一个新对象,在内存中
b、改变了函数内部的this的指向,改成了第一步创建的新对象
c、执行函数内部的代码,并且将第一步创建的对象的__ proto__与构造函数的prototype进行了关联
d、检查当前函数是否主动返回对象,如果没有,则返回第一步创建的新对象
注意
如果在构建函数时,使用this找将来的对象,那么,这个函数绝对不要正常执行
createPerson();//错
否则会造成全局污染(函数中的属性,在使用this时,指向的是window,即通过this给函数添加属性,都添加到了window身上),而且除了污染的信息,什么都得不到;必须通过new关键字来执行
构造函数创建的问题
当一个构造函数被多次new时,如果函数内部通过this设定了方法,那么多次new之后,会在内存中产生多个相同的功能,非常浪费内存,差生太多冗余方法,没有必要,为了节省资源,需要将这个冗余功能,修正,以节省内存
解决这个问题的方法:
在使用构造函数方式构建对象时:
将 将来的属性,写在构造函数内部,通过this绑定给将来的实例
将 将来的方法,写在构造函数的原型上,会自动被将来的实例获取
如:
在这里插入图片描述
在这里插入图片描述
这里的show相当于是通过__ proto__找到CreatePerson.prototype这个父级然后在这个父级中拿到的
因此也不难理解以下的列子了
function Fn(){};
var f = new Fn();
var f2 = new Fn();
Fn.prototype.constructor === Fn;
f.__ proto__ === Fn.prototype;
f.__ proto__.constructor === Fn;
f.__ proto__ === f2.__ proto__ ;
f2.__ proto__ === Fn.prototype;
下面通过一张图来了解构造函数,prototype和__ proto__之间的关系
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值