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

我们都知道,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代码是原型基础经常会用到,原型编程原则主要有四点:

  1. 所有的数据都是对象;
  2. 要得到一个对象不是通过实例化类,而是要找到一个对象并克隆它;
  3. JavaScript中,每个对象都会记住各自的原型;
  4. 如果对象无法响应某个请求,那么它会通过原型链把这个请求委托给它的构造器的原型;

而Javascript的(基于原型的)对象系统正是建立在以上四点原则/规则的基础之上的。

2-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-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

2-3、JavaScript中,每个对象都会记住各自的原型;

Javascript对象与对象原型之间的关系很想我们过去的额“家谱”里长辈与晚辈之间的关系,通过家谱图里的树状图顺着线可以迅速清晰的找到爷爷、爷爷的爸爸妈妈、以及爷爷的爷爷……..。在Js中也存在这也一条线,它连接着对象和对象的原型,这条线就是__proto__属性。

Javascript 给对象提供了__proto__属性,它默认指向对象的构造器的原型对象,即{ Constructor }.prototype

看下面代码:

    var g = new Object();
    console.log( g.__proto__ === Object.prototype ); // 输出:true

__proto__属性可以用来代替前面提到的getPrototypOf ( )方法

2-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)