javascript基于原型的语言的特点
一、基于原型的语言的特点
1 只有对象,没有类;对象继承对象,而不是类继承类。
2 “原型对象”是基于原型语言的核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。
二、基于原型的语言中对象的创建
创建有两个步骤
1. 使用"原型对象"作为"模板"生成新对象
这个步骤是必要的,这是每个对象出生的唯一方式。以原型为模板创建对象,这也是"原型"(prototype)的原意。
2. 初始化内部属性
这一步骤不是必要的。通俗点说,就是,对"复制品"不满意,我们可以"再加工",使之获得不同于"模板"的"个性"。
三、原型,为复用代码而生
四、继承
五、小结
1.原型的本质就是对象引用原型对象的属性,实现代码复用。
2.基于原型的语言是以原型对象为模板创建对象。
js是世界上最容易被误解的语言,原因主要有两个:
1) 作为基于原型的语言中,却连最基本的一个通过原型产生对象的函数都没有,让人不知道js根本上是以对象创建对象。
2) 使用new关键字创建对象,让人误会js是以类似java类的构造函数创建对象,实际上,构造函数在创建对象上起到次要的作用,甚至不需要,重要的只有函数的属性prototype引用的原型对象,新对象以此为模板生成,生成之后才调用函数做初始化的操作,而初始化操作不是必要的。
记:js的面向对象是基于原型的面向对象,对象创建的方式根本上只有一种,就是以原型对象为模板创建对象,new function不是通过函数创建对象,只是刻意模仿java的表象。
七、从javascript的原型本质,理解javascript的构造器模式
1.理解js的使用(new关键字+函数)的创建对象方式,new func()。
function Admin(name){
this.name = name;
this.getName = function(){return this.name};
}
var admin= new Admin('Sn');
分析上面代码。
javascript引入new关键字是为了模仿java创建对象的方式,通过语句var admin = new Admin('Sn') 就生成了一个admin对象。
我们知道,基于原型的语言生成一个步骤有两步:
第一步是使用"原型对象"作为"模板"生成新对象,
第二步是初始化新对象的内部属性。
我们敢肯定地推断,javascript中的new Admin('Sn');必然做了这两件事情,那么
1 "原型对象"在哪里?
2 怎么做到"初始化新对象的内部属性"?
答案是,admin.prototype就是我们要找的"原型对象",通过"以新对象代替this,执行admin函数"做到了"初始化新对象的内部属性"。
使用new+function的方式创建对象,其实就是应用我们设计的函数newInstance(实例化)时的思想;
function newInstance(constructor){
var obj = {};
obj.__proto__ = constructor.prototype;
constructor.call(obj,sliceArguments(arguments,1));
return obj;
}
八. javascript构造器模式的特点
1) javascript的顶层对象是Object.prototype
2) 所有对象有一个__proto__属性。__proto__指向自己的"原型对象",搜索属性的原型链以__proto__为基础。
3) 每个函数都会默认关联一个原型对象。javascript每创建一个函数的时候,都同时创建一个原型对象,赋值到函数的prototype属性,用作使用new 生成实例对象的默认原型对象。该默认原型对象的内容是
{
__proto__:Object.prototype,
constructor: 指向函数本身
}
__proto__指向Object.prototype的目的是为了使生成的实例对象继承顶层对象Object.prototype;
而constructor指向函数本身的目的是为了使生成的实例对象newObject可以直接通过newObject.constructor访问到构造函数,同时构造函数和原型对象可以互相访问也是个良好的设计。但是,实际上,constructor并没有什么用,所以大家可以不理会这个属性,这仅仅是一个优化的设计。
4) 可以修改或替换构造函数都会默认关联的原型对象。
function A(){};
function B(){};
B.prototype = new A(); //原型对象为 new A()对象
B.prototype.constructor = A; //构造函数为A函数,可选
六、javascript对象继承体系结构
1) 所有对象都有自己的原型对象。
2)所有构造函数的原型对象都是Function.prototype,Object.prototype是最顶层的对象。
3) 通过原型继承,所有对象构成了一个完整的系统
javascript基于原型的语言的特点的更多相关文章
- JavaScript - 基于原型的面向对象
JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...
- javascript: 基于原型的面向对象编程
Douglas Crockford指出javascript是世界上最被误解的编程语言.由于javascript缺少常见的面向对象概念,许多程序猿认为javascript不是一个合适的语言.我在做第一个 ...
- javascript基于原型实现面向对象
传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象. 原型是?我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对 ...
- JavaScript基于原型的继承
在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,基于原型的继承相比基于类的继承的概念上更为简单 if( typeof Object.beget !== 'function') { Object. ...
- 通过JavaScript原型链理解基于原型的编程
零.此文动机 用了一段时间的Lua,用惯了Java C++等有Class关键字的语言,一直对Lua的中的面向对象技术感到费解,一个开源的objectlua更是看了n遍也没理解其中的原理,直到看到了Pr ...
- 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统
面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...
- Atitit.prototype-base class-based 基于“类” vs 基于“原型”
Atitit.prototype-base class-based 基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2. 对象的产生有两种基本方式.一种是以原型(proto ...
- 理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。
JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型, ...
- JavaScript对象原型
一.MDN上的解释(有点抽象) 基于原型的语言? JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模 ...
随机推荐
- C#交换两个变量值的多种写法
在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现.本篇使用多种方式实现两个变量值的交换. 假设int x =1; int y = 2;现在交换两个 ...
- linux内核netfilter模块分析之:HOOKs点的注册及调用
转自;http://blog.csdn.net/suiyuan19840208/article/details/19684883 -1: 为什么要写这个东西?最近在找工作,之前netfilter 这一 ...
- blob转base64位 base64位转blob
//**dataURL to blob** function dataURLtoBlob(dataurl) { var arr = dataurl.split(','), mime = arr[0]. ...
- MySQL查询字符串长度最长的记录
select `字段`, length(`字段`) from 表名 where length(`字段`) = ( select max(length(`字段`)) from 表名 )http://s ...
- Android 阴影,圆形的Button
MainActivity.java package com.kale.gridlayout; import android.app.Activity; import android.graphics. ...
- Asp.Net Core Web相对路径、绝对路径整理
一.相对路径 1.关于Asp.Net Core中的相对路径主要包括两个部分:一.Web根目录,即当前网站的目录为基础:二.内容目录wwwroot文件夹,对于静态文件都放在这个目录. 2.获取控制器,A ...
- Tar打包、压缩与解压缩
tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数: -x : 解压缩压缩档案的参数: -z : 是 ...
- 凝聚法层次聚类之ward linkage method
凝聚法分层聚类中有一堆方法可以用来算两点(pair)之间的距离:欧式,欧式平方,manhattan等,还有一堆方法可以算类(cluster)与类之间的距离,什么single-linkage.compl ...
- [转]php 操作数组 (合并,拆分,追加,查找,删除等)
From : http://justcoding.iteye.com/blog/1181962 1. 合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个 ...
- maven项目里,junit的test程序不能访问src/test/resource下面的配置
问题描述 最近在写单元测试,但是不想改动源代码,所以想自己在本test目录下建一个resouces文件夹并添加对应的配置文件,可是发现test程序无法读取这个resouces文件夹下的配置. 问题解决 ...