上周晚上有个朋友让我给她讲关于原型链的知识,我以为这都是小菜一碟,但是一番讲解下来才发现原来我熟悉的也不过是原型链的一小部分,当往上讲到Function和Object以及内置构造函数的时候,就有些牵强了。于是打算写一系列关于原型链这部分的内容。那就写吧,那要从哪里开始写起呢?说原型链,我想到的是为什么会有原型链,什么是原型链,利用原型链我们可以做什么。所以这系列的内容也会按照这个顺序来写。 本章主要讲述的内容是为什么会有原型链。
JavaScript面向对象编程发展史
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”但是,js并不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。那如果我们想要把一些属性和方法封装成一个对象,我们应该怎么做呢?首先,我们要有对象。
1.普通模式创建对象
//Object构造函数创建
var person = new Object()
person.name='css';
person.sayhi=function(){
console.log('hi,i am'+this.name)
}
//字面量创建,与上面效果相同
var person={
name:'css',
sayhi:function(){
console.log('hi,i am'+this.name)
}
}
在这个对象中,name是数据部分,sayhi是数据的行为部分,把数据和数据的行为封装到一起,就构成了一个完整的对象。这种不关心对象里的数据(name)是什么,只关心对象里的数据能做什么(sayhi),并且把数据和数据的行为封装到一起构成一个对象的编程思想叫做面向对象编程,面向对象编程思想的核心就是把万物都抽象成一个一个对象。
注:与面向对象编程相对应的编程思想是面向过程编程,它把数据和数据行为分离,分别封装成数据库和方法库。方法用来操作数据,根据输入的不同返回不同的结果,并且不会对输入数据之外的内容产生影响。与之相对应的设计模式就是函数式编程。
上面用到的两种方法就已经能满足我们的需求了。但是如果想创建一堆相似的对象,上面用到的方法就太麻烦了,试想一下,每创建一个对象就要手动添加属性和方法,那么创建100个呢?1000个呢?大家一般拿到这个需求可能就直接按部就班的上了:
for(let i = 0;i<100;i++){
var person = new Object()
person.name='css';
person.sayhi=function(){
console.log(