创建对象的内存表现
function Person(){}
var p1 = new Person();
var p2 = new Person();
赋值为新对象内存表现
function foo() { }
foo.prototype = {
name: "why",
age: 18,
height: 188
}
// 修正constructor指向 以及还原enumerable
Object.defineProperty(foo.prototype, "constructor", {
value: foo,
enumerable: false,
writable: true,
configurable: true
})
var p1 = new foo();
var p2 = new foo();
console.log(p1.name)
console.log(p2.name)
console.log(Object.getOwnPropertyDescriptor(foo.prototype,"constructor"))
类和对象
在JavaScript其实本来没有类的概念,哪怕是ES5以后的class,严格意义上来说也只是构造函数的语法糖,之所以喜欢称之为类,因为JavaScript也可以面向对象开发。
function Person() {}
var p1 = new Person();
var p2 = new Person();
面向对象的特性
面向对象有三大特性:继承、封装、多态。
- 继承: 继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中)
- 封装: 我们前面将属性和方法封装到一个类中,可以称之为封装的过程
- 多态: 不同的对象在执行时表现出不同的形态
再谈JavaScript原型链
在实现真正的继承之前,我们再来看一下一个非常重要的概念:原型链
Object的原型
Object是所有类的父类,它的原型是[Object: null prototype] {},事实上这个原型就是我们最顶层的原型了,从Object直接创建出来的对象的原型都是 [Object: null prototype] {}。
Object特殊的地方
- 该对象有原型属性,但是它的原型属性已经指向的是null,也就是已经是顶层原型了;
var obj = {}
console.log(obj.__proto__) //[Object: null prototype] {}
console.log(obj.__proto__.__proto__) null
- 该对象上有很多默认的属性和方法
- 该对象是所有类的父类
function Person(name, age){
this.name = name;
this.age = age;
}
var p1 = new Person("why",18);