Javascript面向对象之:原型(prototype)和基于原型的对象系统
2016-03-25 14:15
731 查看
我们都知道,Javascript是一种动态脚本语言,它天生就没有类的概念(Brendan Eich最初在为JavaScript设计面向对象系统时就没有打算加入类的概念)。它是基于原型的面向对象语言,函数才是Js的一等公民。而在JS编程中函数、对象、原型的概念无疑是重中之重。下面就简单总结下这段时间对Js基于原型的对象系统的学习。
下面看一段代码:
所有的数据都是对象;
要得到一个对象不是通过实例化类,而是要找到一个对象并克隆它;
JavaScript中,每个对象都会记住各自的原型;
如果对象无法响应某个请求,那么它会通过原型链把这个请求委托给它的构造器的原型;
而Javascript的(基于原型的)对象系统正是建立在以上四点原则/规则的基础之上的。
可以说Js里看到的所有的对象都是由克隆跟对象而来的,而Object.prototype就是所有对象的原型。
Object.getPrototypeOf( )方法由ECMAScript 5 提供,用于匹配对象的原型。
Javascript 给对象提供了
看下面代码:
将对象原型动态指向其他对象:
一个“类”继承另一个“类”:
1、原型模式
通过克隆现有的对象来创建新的对象下面看一段代码:
var Pandora = function() { this.name = "Pandora_G", this.years = 20, this.love = "python" }; // 实例化Pandora "类" var g = new Pandora(); g.name = "Pandora_Galen"; g.years = 22; g.love = "JavaScript"; console.log( g ); // 输出: { name: 'Pandora_Galen', years: 22, love: 'JavaScript' }
2、原型继承
在我们编写Javascript代码是原型基础经常会用到,原型编程原则主要有四点:所有的数据都是对象;
要得到一个对象不是通过实例化类,而是要找到一个对象并克隆它;
JavaScript中,每个对象都会记住各自的原型;
如果对象无法响应某个请求,那么它会通过原型链把这个请求委托给它的构造器的原型;
而Javascript的(基于原型的)对象系统正是建立在以上四点原则/规则的基础之上的。
<1>、所有的数据都是对象 :
JavaScript根对象: Object
Js中所有对象的祖宗。这是一个空对象;可以说Js里看到的所有的对象都是由克隆跟对象而来的,而Object.prototype就是所有对象的原型。
var obj1 = new Object(); var obj2 = {}; console.log( Object.getPrototypeOf( obj1 ) === Object.prototype ); // 输出: true console.log( Object.getPrototypeOf( obj2 ) === Object.prototype ); // 输出: true
Object.getPrototypeOf( )方法由ECMAScript 5 提供,用于匹配对象的原型。
<2>、要得到一个对象不是通过实例化类,而是要找到一个对象并克隆它;
// 构造函数 var Person = function ( name ) { this.name = name; }; Person.prototype.getName = function() { return this.name; } var a = new Person( " Pandora_Galen " ); console.log( a.name ); // 输出: Pandora_Galen console.log( a.getName ); // 输出: Pandora_Galen console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出: true
<3>、JavaScript中,每个对象都会记住各自的原型;
Javascript对象与对象原型之间的关系很想我们过去的额“家谱”里长辈与晚辈之间的关系,通过家谱图里的树状图顺着线可以迅速清晰的找到爷爷、爷爷的爸爸妈妈、以及爷爷的爷爷……..。在Js中也存在这也一条线,它连接着对象和对象的原型,这条线就是__proto__属性。
Javascript 给对象提供了
__proto__属性,它默认指向对象的构造器的原型对象,即{ Constructor }.prototype
看下面代码:
var g = new Object(); console.log( g.__proto__ === Object.prototype ); // 输出:true
__proto__属性可以用来代替前面提到的getPrototypOf ( )方法
<4>、如果对象无法响应某个请求,那么它会通过原型链把这个请求委托给它的构造器的原型;
这条规则是原型继承的精髓。将对象原型动态指向其他对象:
var obj = { name: "galen" }; var A = function () { this.name = "steven"; }; A.prototype = obj; // 动态改变对象原型指向 var a = new A(); console.log( a.name ); // 输出: galen
一个“类”继承另一个“类”:
var A = function() {}; A.prototype = { name: "galen" }; var B = function() {}; B.prototype = new A(); // 继承类A var b = new B(); console.log( b.name ); // 输出: galen
相关文章推荐
- javascript拖拽应用实例
- JavaScript 三个常用对话框
- js 排序算法
- javascript线程解释(setTimeout,setInterval你不知道的事)
- 接口返回json
- JSON对象及其使用
- 接口返回json
- 接口返回json
- JSON语句解析代码
- 【总结】IE和Firefox的Javascript兼容性总结
- jsp学习笔记之servlet
- js input的限制和提示相结合的例子
- Extjs给TextField赋值
- 坑爹的prototype
- js 元素添加多个监听
- 写给 Rapid D3.js 的评论
- 写给 Rapid D3.js 的评论
- js 判断浏览器类型
- javascript中定时器,主要用来实现局部刷新技术,或者定时调用某方法
- js 自适应手机电脑 轮播图