您的位置:首页 > Web前端 > JavaScript

Javascript面向对象之:原型(prototype)和基于原型的对象系统

2016-03-25 14:15 731 查看
我们都知道,Javascript是一种动态脚本语言,它天生就没有类的概念(Brendan Eich最初在为JavaScript设计面向对象系统时就没有打算加入类的概念)。它是基于原型的面向对象语言,函数才是Js的一等公民。而在JS编程中函数、对象、原型的概念无疑是重中之重。下面就简单总结下这段时间对Js基于原型的对象系统的学习。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: