JS基础之原型 r囧r小猫 2022-01-30 15:29 194阅读 0赞 ## 对象的声明 ## var a = { }; //方法一 var b = new Object(); //方法二 以上两种方式没有任何区别,但是a === b值为false,因为地址不一样。但是var a = \{\};var b = a;这样 === 是为true的,因为指向同一个地址。 ## 原型 ## 当我们声明一个Number类型的变量a,我们可以使用a.toFixed()方法,可是我们并没有给a定义toFixed()方法,那toFixed()是怎么来的呢? 答案是原型。在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。当我们在控制台中输入Number.prototype,会打印出Number对象的prototype: ![在这里插入图片描述][20190519220757423.png] 其中就包括了toFixed()方法。以上方法都是预定义属性。 那么,变量a怎么访问Number.prototype的呢。是通过\_\_proto\_\_,可以在控制台输入a.\_\_proto\_\_打印出的就是Number.prototype,可以用===来对比,结果返回true: ![在这里插入图片描述][20190519221236898.png] 当我们声明:var a = new Number(1);这句话时,a是对象,Number()是函数,可以理解为\_\_proto\_\_是对象属性,而prototype是函数属性,当然函数也是对象。 总结:执行a.toFixed()是,执行的是a.\_\_proto\_\_中的toString()。 String、Boolean对象与Number是一致的,这类对象称为特殊对象。而Object称为普通对象。 ## 普通对象和特殊对象 ## * 普通对象是指Object,它直接指向共用的proto。Object的共用属性是所有对象的共用属性。 * 特殊对象是指String、Number和Boolean这种的对象。拿Number来说,它有一些特有的方法,比如parseInt()、parseFloat(),这些属性是它独有的,共用的proto是没有这些属性的。JS的处理方法是Number对象的\_\_proto\_\_指向存放这些特有方法的对象,然后存放特有方法的对象的\_\_proto\_\_指向普通对象的\_\_proto\_\_。 ## 原型链 ## 还是以上面的a为例a.hasOwnProperty(a),居然返回false,但是Number.prototype(a.**proto**)中并没有hasOwnProperty方法,为什么可以调用hasOwnProperty? 其实是`a.__proto__.__proto__`中有hasOwnProperty(),当`a.__proto__`中找不到调用的方法时,就会去`a.__proto__.__proto__`中查找该方法,直到\_\_proto\_\_的值为null。 这里的`a.__proto__.__proto__`就指向Object.prototype,也就是`a.__proto__.__proto__ === Object.prototype`返回true。 String、Boolean同理。 那当我们声明var b = 1;的时候呢,这种声明方式是不是b就不能调用toFixed()方法了? 答案是可以调用的。当b调用toString()时,会生成一个临时变量,存放new Number(1),然后将new Number(1).toString()后的值返回,再将temp从内存中清除,巧妙地解决了问题。n也可以使用其他Number内置对象,原理和toString()一样。 ## 重要公式 ## 注意大小写,number 和 Number 是不同的 var 对象 = new 函数() 对象.__proto__ === 对象的构造函数.prototype // 推论 var number = new Number() number.__proto__ = Number.prototype var object = new Object() object.__proto__ = Object.prototype var function = new Function() function.__proto__ = Function.prototype // 另外,所有函数都是由 Function 构造出来的,所以 Number.__proto__ = Function.prototype // 因为 Number 是函数,是 Function 的实例 Object.__proto__ = Function.prototype // 因为 Object 是函数,是 Function 的实例 Function.__proto__ == Function.prototye // 因为 Function 是函数,是 Function 的实例! [20190519220757423.png]: /images/20220130/7a099890a9da47f6a2ca3557206e8ba8.png [20190519221236898.png]: /images/20220130/adc6ef11449244c38b4bdfbe990dc7a6.png
还没有评论,来说两句吧...