Javascript中的Prototype到底是啥

Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言。在Javascript中,类和对象看起来没有太多的区别。

通常,这样创建一个对象:

function person(name){
    this.sayHi = function(){
        alert('hi ' + this.name);
    }
    this.name = name;
}

var p = new person("dan");
p.sayHi();


以上,使用new关键字,通过对象(函数也是特殊对象)创建一个对象实例。

在基于类的语言中,属性或字段通常都是在类中事先定义好了,但在Javascript中,在创建对象之后还可以为类添加字段。

function animal(){}
var cat = new animal();
cat.color = "green";

以上,color这个字段只属于当前的cat实例。

对于后加的字段,如果想让animal的所有实例都拥有呢?

--使用Prototype

function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green


通过Prototype不仅可以添加字段,还可以添加方法。

function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green

animal.prototype.run = funciton(){
    console.log("run");
}
dog.run();

原来通过prototype属性,在创建对象之后还可以改变对象的行为。

比如,可以为数组这个特殊对象添加一个方法。

Array.prototype.remove = function(elem){
    var index = this.indexof(elem);
    if(index >= 0){
        this.splice(index, 1);
    }
}

var arr = [1, 2, 3]    ;
arr.remove(2);

除了通过prototype为对象定义属性或方法,还可以通过对象的构造函数来定义类的属性或方法。

function animal(){
    this.color = "green";
    this.run = function(){
        console.log("run");
    }
}

var mouse = new animal();
mouse.run();

以上做法的也可以让所有的animal实例共享所有的字段和方法。并且还有一个好处是可以在构造函数中使用类的局部变量。

function animal(){
    var runAlready = false;
    this.color = "green";
    this.run = funciton(){
        if(!runAlreadh){
            console.log("start running");
        } else {
            console.log("already running")
        }
    }
}

其实,一个更加实际的做法是把通过构造函数结合通过prototype定义一个类的字段和行为。

function animal(){
    var runAlready = false;
    this.run = function(){
        if(!runAlready){
            console.log('i am running');
        } else {
            console.log("i am already running");
        }
    }
}

animal.prototype.color = '';
animal.prototype.hide = funciton(){
    console.log("");
}

var horse = new animal();
horse.run();
horse.hide();

Prototype允许我们在创建对象之后来改变对象或类的行为,并且这些通过prototype属性添加的字段或方法所有对象实例是共享的。

原文地址:https://www.cnblogs.com/darrenji/p/5192995.html