原型链是什么?
只要是对象就会有原型,那么所有的原型就会形成一个链式的结构,这个结构就称为原型链
1 | function Person(){} |
修改原型链
原型链结构可以进行修改
替换原型对象就可以修改原型链结构
原型继承的概念重定义
通过修改原型链的结构实现的继承就是原型继承
属性的搜索原则
在对象访问属性的时候,会遵守一个原则
- 现在对象本身中进行查找,如果本身中有,就直接使用,
- 如果没有,就去原型中查找,如果原型中有,就直接使用
- 如果没有,重复步骤2,直到找到
null
设置属性没有搜索原则,只会在本身中进行搜索
由于属性搜索原则的存在,所以对象可以直接访问
.constructor
属性找到其构造函数
1 | function Human(){ |
复杂的原型链
1 | function Animal(){ |
instanceof关键字
- 对象
instanceof
构造函数 - 检测一个对象是不是通过某个构造函数创建出来的(不准确的说法)
- 检测一个构造函数的原型
(构造函数.prototype)
是否在某个对象的原型链上
1 | function Person(){ |
Object.prototype成员
constructor
指向原型相关的构造函数hasOwnProperty
判断对象本身是否拥有指定的属性 不包含原型中的成员
对象.hasOwnProperty(属性名)
isPrototypeOf
判断一个对象是否某个对象的原型
对象.isPrototypeOf(另外一个对象)
propertyIsEnumerable
判断对象自己的属性是不是可以被遍历(for-in)
如果不是自己的或者不能被遍历都会返回false
对象.propertyIsEnumerable(属性名)
Object.defineProperty(对象,属性名,对象(描述信息))
toLocaleString
toString
都是将对象转换为字符串的方法
tolocalString
打印本地格式的字符串 本地格式是获取的系统设置
toString
直接转换成字符串valueOf
方法
当对象参与运算的时候,会首先调用对象的valuOf
方法获取对象的值
如果获取到的这个值可以参与运算,就直接拿来使用
如果不能参与运算,就会去调用该对象的toString
方法
1 | var obj = { |
- proto 指向对象的原型 非标准属性
1 | var now = new Date(); |