参考文献
JavaScript原型与继承的秘密
__proto__
除null和undefined,JS中的所有数据类型都有这个属性; 它表示当我们访问一个对象的某个属性时,如果该对象自身不存在该属性, 就从它的__proto__属性上继续查找,以此类推,直到找到,若找到最后还是没有找到,则结果为undefined
我们把一个对象的__proto__属性所指向的对象叫该对象的原型;我们可以修改一个对象的原型来让这个对象拥有某种属性或某个方法
// 修改一个Number类型的值的原型 const num = 1; num.__proto__.name = "My name is 1"; console.log(num.name); // My name is 1 // 修改一个对象的原型 const obj = {}; obj.__proto__.name = "dreamapple"; console.log(obj.name); // dreamapple
需注意的是,__proto__属性虽多数浏览器支持,但其实它仅在ECMAScript 2015规范中才被准确定义, 目的是为了给这个传统的功能定制一个标准,以确保浏览器间的兼容性。通过使用__proto__属性来修改一个对象的原型非常慢且影响性能。 所以,若想获取一个对象的原型,推荐用Object.getPrototypeOf 或Reflect.getPrototypeOf,设置一个对象的原型推荐用Object.setPrototypeOf或Reflect.setPrototypeOf
prototype
首先要记住的是,该属性一般只存在于函数对象上; 只要是能作为构造器的函数,都包含这个属性。即只要这个函数能通过new生成一个新对象, 那么这个函数肯定具有prototype属性。因为我们自定义的函数都可通过new生成一个对象,所以我们自定义的函数都有prototype 这个属性
// 函数字面量 console.log((function(){}).prototype); // {constructor: "htmlcode">// 其中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__属性指向null Object.prototype.__proto__ === null // true // 因为Function本身也是一个函数,所以Function函数的__proto__属性指向它自身的prototype Function.__proto__ === Function.prototype // true // 因为Function的prototype是一个对象,所以Function.prototype的__proto__属性指向Object.prototype Function.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 // "hello".constructor // "htmlcode">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); // 输出 "htmlcode">Number.prototype.constructor = "number constructor"; (1).constructor = 1; console.log((1).constructor); // 输出 number constructor当然上面的方式不推荐
以上所述是小编给大家介绍的JS原型和继承详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
DDR爱好者之家 Design By 杰米
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]