每个原型链的终点为Object,Object的原型为null.
-------------------------------------------------------------------
1.每个函数都有一个prototype属性指向原型对象。
2.函数的原型对象开始时只有constructor属性,当函数作为构造函数时,constructor属性指向原函数
3.使用构造函数创建对象实例时:
1)创建一个空对象{}
2)空对象{}的原型为构造函数的prototype属性指向的原型对象
3) 将创建的对象传递给函数的隐式参数this
4) this指向的对象构造函数的上下文,并通过this初始化实例对象。
5)继承:
1)通过对象直接继承。objectA想继承objectB,则可以通过内置方法Object.setPrototypeOf(objectA, objectB),将objectA的原型指向objectB
2)通过构造函数继承。(JS的继承真的太绕了,虽然是继承,但是继承得不明显)
function Person(name){ this.name = name } Person.prototype.eat = function(food){ console.log("i'm eating" + food) }
var humnen = new Person("Jone");
hunmen.eat("beef")
//Person构造方法中并没有eat方法。
//Person原型中有eat方法,所以humen对象可以在原型链中找到eat方法,相当于从Person.prototype对象中继承了eat方法。
3)给构造函数添加方法即可实现类的静态方法。函数为一类对象
function Person(age){ this.age = age } Person.compareAge = function(p1, p2){ return p1.age - p2.age; }
6)通过Object.defineProperty(Person, "height", {
configurable: false,
enumerable: false,
value: 180,
writable: true
})
配置对象的属性,以及getter, setter函数
7)humern instanceof Person 中 instanceof运算符是根据运算符左边的对象(humen)的原型链中是否存在运算符右边的构造函数(Person)的原型对象。