javascript中的prototype到底是什么

嘿_QQ熊      2022-02-09     557

关键词:

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








javascript中的原型声明和用法总结

下面是自己写的一个关于js的拖拽的原型声明:代码如下需要注意的问题包括:1.this的指向到底是指向谁--弄清楚所指的对象2.call()方法的使用3.直接将父级原型赋给子级与使用for将其赋给子级有什么区别?比如:for(variinDrag.prototype... 查看详情

javascript中的prototype与继承

通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。javascript创建对象时采用了写时复制的理念。只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性。prototype... 查看详情

在javascript中prototype和__proto__有什么区别

...的地方,就是prototype和__proto__到底是干嘛的1.__proto__就是Javascript中所谓的原型(这里,我们还是拿具体的例子来说明吧)functionA(name){//这里是一个构造 查看详情

javascript中的prototype(原型)认识

prototype实现了对象与对象的继承,在JS中变量,函数,几乎一切都是对象,而对象又有_ptoro_属性,这个属性就是通常说的原型,是用来指向这个对象的prototype对象,prototype对象又有_proto_属性,就是这样依次递归,直到追溯到objec... 查看详情

javascript中的prototype

Javascript中所有的东西都是对象,而很多对象都有prototype这个成员。了解到这个值的契机还是去面试前端,面试官问我你知道js怎么继承吗,我一脸懵逼。现在想想那时候懂的真是太少了,连入门都算不上。 我先试了一下万物... 查看详情

Javascript:function.prototype.bind() 中的参数解包? [复制]

】Javascript:function.prototype.bind()中的参数解包?[复制]【英文标题】:Javascript:argumentunpackinginfunction.prototype.bind()?[duplicate]【发布时间】:2016-02-0602:32:38【问题描述】:TheclosestI\'veseenisthis,butitdoesn\'treallyhelpmesinceIneedtobin 查看详情

理解javascript中的function.prototype.bind

函数绑定(Functionbinding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其实就是Function.prototype.bind(),只是你有可能仍然没... 查看详情

javascript中的this与prototype,原型理解

JavaScript函数调用JavaScript函数有4种调用方式。每种方式的不同方式在于 this 的初始化。this 关键字一般而言,在Javascript中,this指向函数执行时的当前对象。 注意 this 是保留关键字,你不能修改 this ... 查看详情

javascript中的继承实现,call,apply,prototype,构造函数

javascript中继承可以通过call、apply、protoperty实现1.callcall的含义:foo.call(thisObject,args...)表示函数foo调用的时候,上下文切换为thisObject,意思是用thisObject来调用foo方法,如果没有指定thisObject,则外部的Global对象被用作默认的thisObje... 查看详情

js中的prototype

参考文献:阮一峰的博客  http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html  http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html1、为 查看详情

js中的prototype的用法二

  用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了,最近看了一些JavaScript高级程序设计,... 查看详情

前端修炼-javascript关键字之prototype

  通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。只有构造器(Object,Function,Array,Date,String)才具有且会有一个prototype属性。原型链继承就是创建一个新的指针,指向构造器的prototype属性。... 查看详情

javascript中的继承

一、原型链(默认)functionPerson(){};functionStudent(){};Student.prototype=newPerson();Student.prototype.constructor=Student;缺点:1、传参怎么搞?2、newPerson的实例属性成了Student的原型属性二、借用构造函数functionPerson(name){this.name=name 查看详情

javascript之深入浅出prototype

 我们先来讲一个故事,一个大大的池塘,里面有很多鱼。这是属于我们大家的池塘所以里面的鱼我们都可以吃,但是我们也会从集市买一些鱼放在家里,那么放在家里的鱼肯定是属于我们私人的,外人是不会拥有的。那么在... 查看详情

javascript之深入浅出prototype

 我们先来讲一个故事,一个大大的池塘,里面有很多鱼。这是属于我们大家的池塘所以里面的鱼我们都可以吃,但是我们也会从集市买一些鱼放在家里,那么放在家里的鱼肯定是属于我们私人的,外人是不会拥有的。那么在... 查看详情

javascript面向对象中的继承

1.1继承的基本概念使用一个子类,继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承。>>>继承的两方,发生在两个类之间。实现继承的三种方式:  扩展Object的prototype实现继承、使用... 查看详情

深入理解js面向对象中的prototype(代码片段)

一、基本使用方法  prototype属性可算是JavaScript与其他面向对象语言的一大不同之处。prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加方法,以便在JavaScript中实现“继承”的效... 查看详情

javascript中原型链的结尾是啥——null或Object.prototype?

】javascript中原型链的结尾是啥——null或Object.prototype?【英文标题】:WhatistheendofprototypechaininJavaScript--nullorObject.prototype?javascript中原型链的结尾是什么——null或Object.prototype?【发布时间】:2016-08-1003:05:36【问题描述】:我一直... 查看详情