JS里的原型与原型链

发布 : 2019-05-16 分类 : JavaScript 浏览 :

1、全局对象

ECMAScript规定全局对象叫做global,但浏览器把window作为全局对象(浏览器先存在的)。

window就是一个哈希表,它有很多属性。

window的属性:
第一类是ECMAScript规定的:

  • parseInt
  • parseFloat
  • Number()
  • String()
  • Boolean()
  • Object()

第二类是浏览器自己加的属性(私有的):

  • window.alert(弹框提示)
  • window.prompt(用户填写)
  • window.comfirm(用户确认)
  • window.console.log
  • window.console.dir
  • window.document
  • window.document.createElement
  • window.document.getElementById

其他window提供的所有API参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window

window的属性就是全局变量。

2、简单类型与对象

1
2
var n1 = 1;    //声明一个简单类型
var n2 = new Number(1); //声明一个对象,可以用toString()方法转为字符串

可以通过画内存图查看它们之间的区别。
内存图相关题目与图:传送门

示例:

1
2
var n = 1;
n.xxx = 2;

①请问输入上面代码第二句会报错吗?
②n.xxx的值是什么?
答:
①不会报错,因为JS会创建一个临时对象,并为其添加属性。
②值为undefined。因为给n添加完属性后,临时对象被回收,而n还是一个数值,数值本身没有xxx属性,这个属性的对象已经被删除了的。

String常用API文档:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/Useful_string_methods

3、公有属性(原型)

在JS中有些属性是每一个对象都有的,这样的属性被称为公有属性,即原型。

公有属性意义:不要浪费去声明重复的属性。

所有对象都有toString和valueOf属性,我们不需要给每个对象一个toString和valueOf。因为JS的做法是把toString和valueOf放在一个对象里(暂且叫做公用属性组成的对象),然后让每一个对象的__proto__存储这个「公用属性组成的对象」的地址。

示例

上面的例子中o1和o2是不严格相等的,因为这两个空对象地址不同。但是他们转为toString之后是相等的。虽然没有给这两个空对象添加toString属性,但是它们自带了toString属性,其实这里的toString属性就是一个原型。

原型链:当对象使用属性的时候,首先在自身进行查找,如果有就直接使用,如果没有就沿着__proto__这条链往下去查找,直到找到Object原型位置,有就返回相应的值,没有就返回underfined。

1
2
3
var n = new Number(1)
n.__proto__ === Number.prototype //true
n.__proto__.__proto__ === Object.prototype //true

4、__proto__与prototype

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var 对象 = new 函数()

//__proto__ 是对象的属性,prototype是函数的属性
对象.__proto__ === 函数.prototype

//函数的prototype是对象,这个对象对应的就是函数Object
函数.prototype.__proto__ === Object.prototype

//由于函数本身即是函数(最优先被视为函数),也是对象,而函数的构造函数是Function
函数.__proto__ === Function.prototype

//Function即是对象,也是函数,但他优先是个函数
Function.__proto__ === Function.prototype

//Function.prototype也是对象,是普通的对象,所以其对应的函数是Object
Funciton.prototype.__proto__=== Object.prototype

所有函数都是由Function构造出来的,因此:

1
Object.__proto__=Function.prototype //因为Object是函数,是Function的实例

本文作者 : LqZww
原文链接 : http://yoursite.com/2019/05/16/js-li-de-yuan-xing-yu-yuan-xing-lian/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
支付宝扫一扫, 向我赞赏

支付宝扫一扫, 向我赞赏

微信扫一扫, 向我赞赏

微信扫一扫, 向我赞赏

留下足迹