什么是OOP?
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。
原型
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了class 关键字,但只是语法糖,JavaScript 仍旧是基于原型)。
涉及到继承这一块,Javascript 只有一种结构,那就是:对象。在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)。
虽然,原型继承经常被视作 JavaScript 的一个弱点,但事实上,原型继承模型比经典的继承模型更强大。举例来说,在原型继承模型的基础之上建立一个经典的继承模型是相当容易的。
__proto__
__proto__
是对象的一个内部隐藏属性,它的值是该对象的原型。__proto__
属性可用于获取对象的原型。
从 ECMAScript 6 开始,Object.getProtoypeOf(obj)方法返回指定对象的原型(也就是该对象内部属性[[prototype]]的值),Object.setProtoypeOf(obj, prototype)将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性).
构造函数的prototype属性
JavaScript 不包含传统的类继承模型,而是使用 prototype 原型模型。
|
|
我们创建的每一个函数都会有prototype
预设属性,Foo.prototype
是一个对象。Foo.protoytype
结构:
通常,我们说Foo.prototype
就是Foo
的原型。Object构造函数用来创建对象。
我们看到,Foo.prototype
中包含construtor
属性和__proto__
属性,contructor
就是构造函数Foo
本身,__proto__
属性指向对象原型。
对象原型Object.prototype
包含了一些方法如 tostring
, valueOf
。
如何为Foo的原型添加属性
添加属性方法只需
这样所有构造函数Foo
new出来的实例都会有sayHi
属性
构造函数Foo与new一个实例
|
|
实例foo的原型就是Foo.prototype
原型链
一个例子
|
|
我们看下以上代码的流程,首先构造函数Person
并给其原型添加一系列属性(如hi
),然后构造函数Student
,并将Foo
的属性应用到Student
,再通过
继承Person
的原型。Object.create
在ECMAScript 5才有,之前的版本,我们可以自行构造这个方法
根据控制台信息,很容易看出实例 bson
通过__proto__
指向 Student.prototype
,而Student.prototype
通过__proto__
指向 Person.prototype
,Person.prototype
通过__proto__
指向 Object.prototype
。这就是一条原型链。原型链上的所有方法 bson
都可以调用。