美文网首页
Javascript:prototype属性

Javascript:prototype属性

作者: 路秋原 | 来源:发表于2018-11-14 06:00 被阅读0次

    在阅读这篇文章时,请你先清空脑中所有对原型一知半解的印象,首先来看Javascript中函数所具有的一个属性:prototype.

    先看下面这个例子:

    function f() { } // define a function f
    
    console.log(f.prototype.constructor === f); // true
    

    运行上面代码

    当我们创建一个函数f,这个函数会自动具有一个属性prototype,这个属性即为函数f的原型。并且这个它的原型自动会具有一个属性constructor,指向函数f。这里我们可以看出一种一一对应关系,即一个函数具有一个原型,而这个原型又通过属性constructor指明它是哪一个函数的原型。

    可是原型有什么用呢?让我们来看一个创建对象的例子:

    function Car(brand, year) {
      this.brand = brand;
      this.year = year;
    } // 定义一个函数Car
    
    let car = new Car("玛莎拉蒂", 2014);  // 从函数Car创建一个对象
    console.log(car.brand); // 玛莎拉蒂
    console.log(car.year);  // 2014
    console.log(car.has_wheels);  // undefined,因为我们没有定义has_wheels属性
    car.drive();  // 报错,因为我们没有定义drive函数
    

    运行上面代码

    上面的代码中,brandyear都是每一辆车所独有的,但属性has_wheels与函数drive刚是所有的车所共有的。下面的代码展示了,如何用原型来实现这种“共有”的属性和函数。

    function Car(brand, year) {
      this.brand = brand;
      this.year = year;
    } // 定义一个函数Car
    
    Car.prototype.has_wheels = true;
    Car.prototype.drive = function() {
      console.log("driving...");
    }
    
    let car = new Car("玛莎拉蒂", 2014);  // 从函数Car创建一个对象
    console.log(car.brand); // 玛莎拉蒂
    console.log(car.year);  // 2014
    console.log(car.has_wheels);  // true
    car.drive();  // 打印出driving
    

    运行上面代码

    从上面的代码,我们可以很容易地了解到Javascript对于面向对象的设计思想,那就是

    1. 使用new函数并配合构造函数(constructor)来创建对象,
    2. 运行构造函数(constructor)来设置对象“独有”的属性和方法,
    3. 对构造函数(constructor)的prototype进行更改可以对所有由它创建的对象设置“共有”的属性和方法。

    要注意的是,只有函数有prototype属性,也就是说只有函数有原型,而非函数的对象是没有的。

    更多关于原型的探讨请参见:

    1. JavaScript:prototype属性
    2. JavaScript:内部属性[[Prototype]]
    3. Javascript:原型与类

    相关文章

      网友评论

          本文标题:Javascript:prototype属性

          本文链接:https://www.haomeiwen.com/subject/drgkfqtx.html