当前位置:蜗牛素材网>综合资讯>图文>正文

javascript全套知识点:javascript核心知识,六

人气:415 ℃/2024-02-08 19:25:23

一、原型

原型是顺应人类自然思维的产物。中文中有个成语叫做“照猫画虎”,这里的猫看起来就是虎的原型,所以,由此我们可以看出,用原型来描述对象的方法可以说是古已有之。

我们在上一节讲解面向对象的时候提到了:在不同的编程语言中,设计者也利用各种不同的语言特性来抽象描述对象。

还有一种就是基于原型的编程语言,它们利用原型来描述对象。我们的 JavaScript 就是其中代表。

  1. Function.prototype.__proto__ === Object.prototype //true
  2. __proto__所有对象都有,prototype只有函数才有。
  1. 应用层面:

    每个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向原型。

    每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。

  2. 原型链和原型对象一一对应,原型链一定指向原型对象。
原型和原型链
  • 属性查找机制: 当查找对象的属性时,如果实例对象自身不存在该属性,则沿着原型链往上一级查找,找到时则输出,不存在时,则继续沿着原型链往上一级查找,直至最顶级的原型对象Object.prototype,如还是没找到,则输出 undefined;
  • 属性修改机制: 只会修改实例对象本身的属性,如果不存在,则进行添加该属性,如果需要修改原型的属性时,则可以用: b.prototype.x = 2;但是这样会造成所有继承于该对象的实例的属性发生改变。

//js引擎部分<script> const l = console.log // 一、 2个顶级原型对象 l(Object.prototype) // ->{constructor:f} 普通对象 l(Function.prototype) // -> ƒ () { [native code] } 函数对象 // 二、他们的构造函数 l(Object.prototype.constructor) // ->ƒ Object() { [native code] } l(Function.prototype.constructor === Function) // -> ƒ Function() { [native code] } // 三、他们的原型链关系 l(Object.prototype.__proto__) // ->null l(Function.prototype.__proto__) // ->{constructor:f} Object.prototype // 四、利用Function.prototype,内置了很多高阶函数对象(一百多种) l(Array.__proto__ === Function.prototype) // -> true l(Boolean.__proto__ === Function.prototype) // -> true l(Date.__proto__ === Function.prototype) // -> true l(eval.__proto__ === Function.prototype) // -> true l(Function.__proto__ === Function.prototype) // -> true 悖论:自己产生了自己?为了逻辑的完整性</script> // 以上全是浏览器集成的js引擎提供的机制

//应用层<script>// 五、应用层之函数:所有函数都是 new Function生成的。 const date2 = new Date() l(date2) /* Date.prototype.eat = function () { l('吃了苹果') } const date1 = new Date() date1.eat() l(date1) l(date1.getDate()) l(date1.getFullYear()) l(date1.getMonth()) */ Date.prototype.eat = new Function() const date1 = new Date() date1.eat() // 六、应用层之对象:所有对象都是 new Ojbect生成的。 let obj1 = {} // let obj1 = new Object() l(obj1.__proto__ === Object.prototype) //true</script>[[prototype]] 和 __proto__

旧版浏览器有__proto__,新版浏览器没有__proto__。

es6为了保证新旧版浏览器的兼容性,无论是否支持__proto__属性,都纳入了规范。但是不推荐使用。

搜索更多有关“javascript全套知识点:javascript核心知识,六”的信息 [百度搜索] [SoGou搜索] [头条搜索] [360搜索]
本网站部分内容、图文来自于网络,如有侵犯您的合法权益,请及时与我们联系,我们将第一时间安排核实及删除!
CopyRight © 2008-2024 蜗牛素材网 All Rights Reserved. 手机版