Javascript中的Prototype到底是什么

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

什么是prototype:

function定义的对象有一个prototype属性,prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。 是不是很绕?用伪代码表示如下:

?


1

2

3

4

5

var function{

prototype:prototype{

constructor:constructor == function

}

}

还不明白?看图吧:

prototype的作用:

这个prototype到底有什么作用呢?看下面的例子:

?


1

2

3

4

5

function jb51(){

}

jb51.prototype.name = "a";

var test = new jb51();

alert(test.name)//"a";

奇怪吧,明明没有为test设置name属性,可是为什么会有值?

这就是prototype的功劳了,uw3c中prototype属性中的name对象,在uw3c被new构造函数之后,被继承到了对象test的属性中。接着看:

?


1

2

3

4

5

6

7

var name = "js";

function jb51(name){

alert(this.name);//"css"

}

jb51.prototype.name = "css";

var test = new jb51();

test()

为什么alert的值不是“js”?这个过程大致如下:

?


1

2

var test={};

uw3c.call(test);

第一步是建立一个新对象(test)。

第二步将该对象(test)内置的原型对象设置为构造函数(就是uw3c)prototype 属性引用的那个原型对象。

第三步就是将该对象(test)作为this 参数调用构造函数(就是uw3c),完成成员设置等初始化工作。

其中第二步中出现了一个新名词就是内置的原型对象,注意这个新名词跟prototype对象不是一回事,
为了区别我叫它inobj,inobj就指向了函数uw3c的prototype对象。在uw3c的prototype对象中出现的任何属性或者函数都可以在test对象中直接使用,这个就是JS中的原型继承了。

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

?


1

2

3

4

5

6

7

8

function person(name){

this.sayHi = function(){

alert(‘hi ‘ + this.name);

}

this.name = name;

}

var p = new person("dan");

p.sayHi();

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

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

?


1

2

3

function animal(){}

var cat = new animal();

cat.color = "green";

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

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

?


1

2

3

4

5

6

7

--使用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不仅可以添加字段,还可以添加方法。

?


1

2

3

4

5

6

7

8

9

10

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属性,在创建对象之后还可以改变对象的行为。

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

?


1

2

3

4

5

6

7

8

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为对象定义属性或方法,还可以通过对象的构造函数来定义类的属性或方法。

?


1

2

3

4

5

6

7

8

function animal(){

this.color = "green";

this.run = function(){

console.log("run");

}

}

var mouse = new animal();

mouse.run();

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

?


1

2

3

4

5

6

7

8

9

10

11

function animal(){

var runAlready = false;

this.color = "green";

this.run = funciton(){

if(!runAlreadh){

console.log("start running");

} else {

console.log("already running")

}

}

}

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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属性添加的字段或方法所有对象实例是共享的。

来自:http://www.jb51.net/article/79549.htm

时间: 2024-11-05 15:59:22

Javascript中的Prototype到底是什么的相关文章

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中的prototype

以前一直对javascript中的prototype不是很理解,今天在阅读了<javascript高级程序设计之后>终于理解了其中的prototype.来简单的总结一下从书中学习到的内容. 我们都知道在创建了一个function之后,这个function就具有了prototype这样的一个属性,利用这个prototype我们可以做很多的事情,其中我们经常用到的一点就是利用它来当做构造函数,因此,本文重要从function作为构造函数的角度来说明一下prototype. 其实javascript

JavaScript中Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下:

JavaScript中的prototype和__proto__细致解析

最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的基础知识,首先我们先看一段js代码: 1 var object = new Object; 2 console.log("object:", object); 3 object.member1 = "abcd"; 4 5 var obj = {}; 6 obj.memb

Javascript中的prototype与继承

通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性. prototype属性之所以特别,是因为javascript时读取属性时的遍历机制决定的.本质上它就是一个普通的指针. 构造器包括: 1.Object 2.Function 3.Array 4.Date 5.String 下面我们来举一些例

this详解:JAVASCRIPT中的this到底是谁?

语法 this 全局对象 在全局执行上下文(函数之外),this引用的是全局对象. console.log(this.document === document); // true // In web browsers, the window object is also the global object: console.log(this === window); // true this.a = 37; console.log(window.a); // 37 函数 在函数里面,this这

深入理解Javascript中this, prototype, constructor

在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则this为当前页面对象window;如果在函数中使用this,则this为调用该函数的对象;可以使用apply和call两个全局函数来改变this的指向. 接下来,首先通过几个demo程序验证一下: function testFunction(){ console.log(this.variable

JavaScript——中的prototype(原型)

JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javascript的方法可以分为三类: a 类方法 b 对象方法 c 原型方法 例子: function People(name){  this.name=name;  //对象方法  this.Introduce=functi

javascript中的prototype和constructor

http://www.jb51.net/article/25027.htm http://blog.csdn.net/chunqiuwei/article/details/22092551 http://developer.51cto.com/art/200907/134913.htm 总结: 特别说明:只有构造函数才有prototype属性,而构造函数的实例是没有该属性的,也就是说 console.log(a1.prototype)输出的是undefined.在javascript中,每个函数