js面向对象的实现原理

责编:menVScode 2017-08-18 12:42 阅读(1040)

        一、js语言设计思路

        JavaScript借鉴了:c的基本语法,java的基本数据类型以及内存管理,scheme的函数编程语言的风格 --“第一等公民”,self的原型(prototype)的继承机制。JavaScript是一种多种语言混合的产物,javascript=函数式编程+面向对象编程。

        

        二、面向对象

        面向对象语言,就会经常使用对象,对象是一系列属性和方法的综合体。(属性和方法是继承原型上而来的。)并且不存在独立的函数/属性   所有的函数/属性必须是某个对象的方法/属性。

        类,在现实生活中,相似对象之间往往都会有一些共同的组成特征。我们可以基于同一个类创建出许多不同的对象。因为类更多的是一种模板,而对象则是在这些模板的基础上被创建出来的实体或者实例化对象。

        类是不能够直接来操作的,只有通过new命令实例化它的对象,用实例化对象进行相关操作方法和属性,属性和方法是继承原型上而来的。

        原型,prototype本身是属性,是函数对象的一个属性:函数对象.prototype。所有的数据都是对象,对象会记住他的原型,当请求访问对象的某个方法,无法响应时,会把这个请求委托给他自己的原型(原型链)。

        在js语言中,在es6之前,类的概念是不存在的,而是构造构造函数,可以理解为是其他语言中类的概念。构造函数通过function来定义的,构造函数本身也是一个对象。

QQ截图20170818124156

        构造函数本质也是对象。

        类中封装许多的属性和方法,以供其实例对象来使用。但是在js中会选择另一种方式,封装不是封装在当前的构造函数上的,是封装在当前构造函数的prototype属性上,这个属性所指向的是原型对象,我们把这些属性和方法封装在原型对象里面。我们发现继承方式,直接发生的关系并不是实例对象和构造函数之间,而是实例对象与原型对象之间的。而且是这种继承也要叫做访问权限。

        

        三、例子

function Person(){
}

Person.prototype = {
	sex:'男',
	run:function(){
		console.log('running....');
	}
}

var xiaoming = new Person();
xiaoming.sex = '保密'console.log(xiaoming.sex);

        首先创建构造函数Person,在其原型对象上封装属性(sex)和方法(run)。通过new Person命令来创建实例化对象(xiaoming)。

        如果打印 console.log( xiaoming.sex ),那么其结果为 '男'。这是因为当请求访问对象的某个方法/属性,如果自身没有无法响应时,对象会把请求委托他自己的原型,去原型对象访问这个方法/属性。

        如果实例化对象xiaoming自己定义一个 xiaoming.sex='保密',那么打印 console.log( xiaoming.sex ) 的结果为 '保密'。因为当请求访问对象的某个方法/属性,刚好对象本身就存在这个方法/属性,那么就不用委托他的原型了。

QQ截图20170818131658

前端交流群: MVC前端网(menvscode.com)-qq交流群:551903636

邮箱快速注册

忘记密码