面向对象思想主要是指实现封装、继承和多态
创建对象
1.工厂模式,传入必要的参数,返回一个特定的对象,缺点是每个对象都会生成一个实例方法
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.sayName = function () {
alert(this.name)
}
return o
}
2.构造函数模式
function Person(name, age, job) {
this.name = name
this.job = job
this.age = age
this.sayName = function () {
alert(this.name)
}
}
var person = new Person('jack', 24, 'job')
3.原型模式
理解原型对象:
创建函数的时候,会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。默认情况下,每个原型对象都会自动获得一个constructor属性,是一个指向prototype属性所在函数的指针。在创建对象实例后,实例内部会包含一个指针[[prototype]],指向构造函数的原型对象。实例与构造函数的连接 存在于实例与构造函数的原型对象之间,而不是实例与构造函数之间。
原型对象是一个默认包含constructor属性的对象,是函数的一个属性
每当代码读取对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象。
new 操作符的作用
用来创建用户自定义的对象
当代码 new Person(...) 执行时,会发生以下事情:
1.一个继承自 Foo.prototype 的新对象被创建。
2.使用指定的参数调用构造函数 Foo ,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
3.由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
继承
prototype与[[prototype]](Object.getPrototypeOf())的区别
prototype是函数的一个属性,为一个默认包含constructor属性的对象
[[prototype]]是对象的原型链属性,是一个私有变量,用于属性方法的继承Object.getPrototypeOf(obj) === Object.prototype