时间:2021-05-18
参考文献
JavaScript原型与继承的秘密
__proto__
除null和undefined,JS中的所有数据类型都有这个属性; 它表示当我们访问一个对象的某个属性时,如果该对象自身不存在该属性, 就从它的__proto__属性上继续查找,以此类推,直到找到,若找到最后还是没有找到,则结果为undefined
我们把一个对象的__proto__属性所指向的对象叫该对象的原型;我们可以修改一个对象的原型来让这个对象拥有某种属性或某个方法
需注意的是,__proto__属性虽多数浏览器支持,但其实它仅在ECMAScript 2015规范中才被准确定义, 目的是为了给这个传统的功能定制一个标准,以确保浏览器间的兼容性。通过使用__proto__属性来修改一个对象的原型非常慢且影响性能。所以,若想获取一个对象的原型,推荐用Object.getPrototypeOf或Reflect.getPrototypeOf,设置一个对象的原型推荐用Object.setPrototypeOf或Reflect.setPrototypeOf
prototype
首先要记住的是,该属性一般只存在于函数对象上; 只要是能作为构造器的函数,都包含这个属性。即只要这个函数能通过new生成一个新对象, 那么这个函数肯定具有prototype属性。因为我们自定义的函数都可通过new生成一个对象,所以我们自定义的函数都有prototype这个属性
prototype属性有什么作用呢?作用就是:函数通过new生成的一个对象, 这个对象的原型(__proto__)指向该函数的prototype属性:
// 其中F表示一个自定义的函数或者是含有prototype属性的内置函数new F().__proto__ === F.prototype // true // 通过函数字面量定义的函数的__proto__属性都指向Function.prototype(function(){}).__proto__ === Function.prototype // true // 通过对象字面量定义的对象的__proto__属性都是指向Object.prototype({}).__proto__ === Object.prototype // true // Object函数的原型的__proto__属性指向nullObject.prototype.__proto__ === null // true // 因为Function本身也是一个函数,所以Function函数的__proto__属性指向它自身的prototypeFunction.__proto__ === Function.prototype // true // 因为Function的prototype是一个对象,所以Function.prototype的__proto__属性指向Object.prototypeFunction.prototype.__proto__ === Object.prototype // trueconstructor
constructor表示一个对象的构造函数,除null和undefined,JS中的所有数据类型都有这个属性; 我们可通过下面的代码来验证一下:
null.constructor // Uncaught TypeError: Cannot read property 'constructor' of null ...undefined.constructor // Uncaught TypeError: Cannot read property 'constructor' of undefined ... (true).constructor // ƒ Boolean() { [native code] }(1).constructor // ƒ Number() { [native code] }"hello".constructor // ƒ String() { [native code] }一个对象的constructor属性确切地说并不是存在这个对象上面的; 而是存在这个对象的原型上(如果是多级继承需手动修改原型的constructor属性),我们可用下面的代码来解释一下:
const F = function() {};// 当我们定义一个函数的时候,这个函数的prototype属性上面的constructor属性指向自己本身F.prototype.constructor === F; // true对JS的原始类型(string, number, boolean, null, undefined, symbol (new in ECMAScript 2015)),它们的constructor属性是只读的,不可修改:
(1).constructor = "something";console.log((1).constructor); // 输出 ƒ Number() { [native code] }如果真想改这些原始类型的constructor属性,也不是不可以:
Number.prototype.constructor = "number constructor";(1).constructor = 1;console.log((1).constructor); // 输出 number constructor当然上面的方式不推荐
以上所述是小编给大家介绍的JS原型和继承详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在讲js的原型之前,必须先了解下Object和Function。Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己
温馨提示:想要更好的理解JS继承方式,须了解构造函数、原型对象、实例化对象、原型链等概念第一种:原型链继承利用原型链的特点进行继承functionParent(
本文实例讲述了JS实现继承的几种常用方式。分享给大家供大家参考,具体如下:1,原型链继承原型链继承/***优点:*实例是父类的实例也是子类的实例*父类新增原型方
原型链继承原型链继承是ECMAScript的主要继承方式。其基本思想就是通过原型继承多个引用类型的属性和方法。什么是原型链?每个构造函数都会有一个原型对
一:js原型继承四步曲//js模拟类的创建以及继承//动物(Animal),有头这个属性,eat方法//名字这个属性//猫有名字属性,继承Animal,抓老鼠方