javascript基于原型实现面向对象
传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象。
原型是?
我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对象。使用原型对象可以让构造函数的实例对象共享原型对象包含的属性和方法,而不会像工厂模式或者构造函数模式那样,方法本应该是可以是通用的,可是每一个创建的对象实例都要各自复制一份。
function People(name){
this.name=name;
this.sayName=function(){
console.log("Hi! my name is "+this.name);
};
}
var Jerel=new People("Jerel");
var AsenZ=new People("AsenZ");
console.log(Jerel.sayName==AsenZ.sayName); //false
但使用原型模式的话,同一个方法是被不同对象实例所引用的,上面的结果会返回ture。
function People(name){
this.name=name;
}
People.prototype.sayName=function(){
console.log("Hi! my name is "+this.name);
};
var Jerel=new People("Jerel");
var AsenZ=new People("AsenZ");
console.log(Jerel.sayName==AsenZ.sayName); //true
构造函数实例化的过程中发生了什么
构造函数通过new操作符实例化的每一个对象,都会生成一个指向构造函数原型对象的指针,不过在这里不是prototype(构造函数通过prototype指针指向原型对象),而是[[prototype]](或者叫—proto—),同时构造函数内部的this指针会绑定到该对象实例上。
构造函数内部绑定在this指针下的所有属性或者方法会被复制下来,作为实例对象的一部分,但是呢原型中定义的属性和方法仍是属于原型自身的,不归对象实例所有。对象只是引用。对象在调用一个属性或者方法时,如果在构造函数内部没有相应的定义,则会通过[[prototype]]指针去原型对象中寻找。
继承
——借用构造函数
如果需要继承构造函数内部this指针所绑定的所有属性和方法的话,可以在子构造函数中使用call方法,call方法的第一个参数会传入一个对象,这个对象会用来替换调用call方法的方法中的this,所以我们call方法的第一个参数可以传入子构造函数内部的this指针。
但是这种方法却继承不了原型内部的属性和方法。
function People(name){
this.name=name;
}
People.prototype.sayName=function(){
console.log("Hi! my name is "+this.name);
};
function Boy(name){
People.call(this,name);
}
var Jerel=new Boy("Jerel");
console.log(Jerel.name); //Jerel
console.log(Jerel.sayName); //undefined
如果需要继承原型对象的内部属性和方法的话呢?
——组合继承(借用构造函数+原型链)
function People(name){
this.name=name;
}
People.prototype.sayName=function(){
console.log("Hi! my name is "+this.name);
};
function Boy(name){
People.call(this,name);
}
Boy.prototype=new People();
Boy.prototype.constructor=Boy;
var Jerel=new Boy("Jerel");
console.log(Jerel.name); //Jerel
Jerel.sayName(); //Hi! my name is Jerel
还有不少其他的实现继承的方法,不过感觉思路差不了多少的,这一篇总结主要是为了加深一下自己对原型的理解。
虽然说有了babel,现在ES6已经可以放开的使用了!class定义类,extends实现继承不能再爽,但是这些新特性也不过是语法糖,底层的原理还是离不开最基本的原型。
javascript基于原型实现面向对象的更多相关文章
- JavaScript - 基于原型的面向对象
JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...
- javascript: 基于原型的面向对象编程
Douglas Crockford指出javascript是世界上最被误解的编程语言.由于javascript缺少常见的面向对象概念,许多程序猿认为javascript不是一个合适的语言.我在做第一个 ...
- javascript基于原型的语言的特点
一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2 “原型对象”是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己 ...
- JavaScript基于原型的继承
在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,基于原型的继承相比基于类的继承的概念上更为简单 if( typeof Object.beget !== 'function') { Object. ...
- 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统
面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...
- JavaScript初探系列之面向对象
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- Atitit.prototype-base class-based 基于“类” vs 基于“原型”
Atitit.prototype-base class-based 基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2. 对象的产生有两种基本方式.一种是以原型(proto ...
- javascript面向对象 用new创建一个基于原型的javascript对象
//创建一个类 其实就是个对象 var Student={ name:"robot", height:1.6, run:function(){ console.log(this.n ...
- 通过JavaScript原型链理解基于原型的编程
零.此文动机 用了一段时间的Lua,用惯了Java C++等有Class关键字的语言,一直对Lua的中的面向对象技术感到费解,一个开源的objectlua更是看了n遍也没理解其中的原理,直到看到了Pr ...
随机推荐
- lucene索引
一.lucene索引 1.文档层次结构 索引(Index):一个索引放在一个文件夹中: 段(Segment):一个索引中可以有很多段,段与段之间是独立的,添加新的文档可能产生新段,不同的段可以合并成一 ...
- [转+原]chrony
greenplum,openstack等云计算项目需要集群服务器部署,服务器之间的时间需要同步,但并不是所有机器可以 直接连外网,这时可以用Chrony工具解决. 解决方法是将其中一台设为时间服务器, ...
- GitHub中wiki的Markdown编辑方法!!
Hello MarkDown!正常的文本 一级大标题用一个#号 一级中等标题用两个#号 一级小标题用三个#号(一次类推,一共有6级标题) 下面是无序列表 无序标题1-只需要在标题前面加上*号就可以了或 ...
- c++ static变量
C++中Static作用和使用方法 1.什么是static? static是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 2.为什么要引入static? 函数内部定义的变量, ...
- 【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现
最近因为一些原因需要接触一些ACM的东西,想想写个blog当作笔记吧!同时也给有需要的人一些参考 话不多说,关于斐波那契数列(Fibonacci sequence)不了解的同学可以看看百度百科之类的, ...
- ZOJ 1808 Immediately Decodable
字典树较简单题,无需维护标记,注意细节即可. 代码: #include <iostream> #include <cstdio> #include <cstring> ...
- java 21 - 7 IO流小结的图解
- tp2.2.2新特点
1.不需要在配置文件中配置URL_MODEL变量就可以用普通模式和路径模式及兼容模式访问URL,但重写模式不可以. 2.当访问的URL地址没有指明具体动作(控制器里的方法)的时候,如果该控制器对应的视 ...
- Swift中的Masonry第三方库——SnapKit
在OC开发时我常用一个名叫Masonry的第三方Autolayout库,在转Swift后发现虽然Swift可以混编OC,但总感觉有些麻烦,在Github上发现了这个叫做SnapKit的第三方库 ...
- 06Spring_使用注解配置bean对象
Spring注解开发需要jar包 和 xml开发 一样的 ! 第一步: 新建项目, 导入jar包(就是前一篇文章里面的那几个核心jar包) 第二步: 在需要spring创建对象类上面 添加@Compo ...