JavaScript中的prototype


1、prototype

在JavaScript中并没有类的概念,但JavaScript中的确可以实现重载,多态,继承。这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释。

2、Simple Example

var Blog = function( name, url ){
    this.name = name;
    this.url = url;
};
Blog.prototype.jumpurl = '';
Blog.prototype.jump = function(){
    window.location = this.jumpurl;
};
/*
 *等同于
Blog.prototype = {
    jumpurl : '',
    jump : function(){
        window.location = this.jumpurl;
    }
};
*/
var rainman = new Blog('rainman', 'http://rainman.cnblogs.com');
var test = new Blog('test', 'http://test.cnblogs.com');

这是一个非常简单的例子,但却可以很好的解释prototype内在的一些东西,先看下图的内存分配:
rainman.cnblogs.com

通过上图可以看到下面这些内容:

  • prototype只是函数的一个属性,该属性的类型是一个对象。
  • 内存分配状况:
    函数Blog拥有一个prototype属性,而prototype属性拥有一个变量和一个函数;
    test和rainman两个变量都分别有name和url两个变量;
    test和rainman两个变量都有一个jumpUrl变量和一个jump函数,但是并没有分配内存,它们是对Blog.protype中的引用

 

3、扩展1:Website.prototype = Blog.prototype

var Blog = function( name, url ){
    this.name = name;
    this.url = blogurl;
};
Blog.prototype.jumpurl = '';
Blog.prototype.jump = function(){
    window.location = this.jumpurl;
};
var rainman = new Blog('rainman', 'http://rainman.cnblogs.com');
var test = new Blog('test', 'http://test.cnblogs.com');

var Website = function(){};
Website.prototype = Blog.prototype;
var mysite = new Website();

rainman.cnblogs.com

通过上图可以看到下面这些内容:

  • "Website.prototype = Blog.prototype;":Website的prototype并没有分配内存,只是引用了Blog的prototype属性。
  • mysite的两个属性也没有分配内存,也只是分别引用了Blog.prototype.jumpurl和Blog.prototype.jump

 

4、扩展2:Website.prototype = new Blog()

var Blog = function(){};
Blog.prototype.jumpurl = '';
Blog.prototype.jump = function(){
    window.location = this.jumpurl;
};

var Website = function(){};
Website.prototype = new Blog();
var mysite = new Website();

rainman.cnblogs.com

通过上图可以看到下面这些内容:

  • Website的prototype属性,只是Blog的一个实例( 同rainman=new Blog(); );因此Website的prototype属性就具有了jumpurl变量和jump方法了。
  • mysite是Website的一个实例,它的jumpurl和jump方法是继承自Website的prototype,而Web.prototype继承自Blog.prototype(这里与其说是继承,不如说是引用)
  • 整段程序在运行的过程中,内存中只分配了一个jumpurl变量和一个jump方法

5、new运算符

JavaScript中new运算符是创建一个新对象。使用方法:

new constructor[(arguments)]
其中constructor是必选项。对象的构造函数。如果构造函数没有参数,则可以省略圆括号。
arguments是可选项。任意传递给新对象构造函数的参数。

JavaScript中new运算符说明
new 运算符执行下面的任务: 
创建一个没有成员的对象。 
为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。 
然后构造函数根据传递给它的参数初始化该对象。 
示例
下面这些是有效的 new 运算符的用法例子。
my_object = new Object;
my_array = new Array();
my_date = new Date("Jan 5 1996");

   

6、其它
  • 在绝大多数JavaScript版本中,JS引擎都会给每个函数一个空的原型对象,即prototype属性。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScriptprototype和constructor是JavaScript的两个概念,用于实现对象的继承和构造。 prototype(原型)是JavaScript每个对象都有的一个属性,它指向该对象的原型(即父对象)。每个函数都有一个prototype属性,它是一个指向该函数的原型对象的指针。通过修改prototype,可以给该函数的实例对象添加新的属性和方法。这样,函数的实例对象就可以共享这些属性和方法,从而实现了对象的继承。 constructor(构造函数)是一个指向创建该对象的函数的指针。每个对象都有一个constructor属性,它指向该对象的构造函数。通过Constructor属性,我们可以追踪一个对象是由哪个构造函数创建的,以便在需要时通过构造函数进行实例化。 通过prototype和constructor的结合使用,可以在JavaScript实现对象的继承和构造。具体的步骤如下: 1. 创建一个构造函数,并定义其原型对象的属性和方法。 2. 使用new关键字实例化一个对象。 3. 通过对象的constructor属性,可以确定对象是由哪个构造函数创建的。 4. 进一步修改构造函数的原型对象,可以为所有实例对象添加新的属性和方法。 JavaScript的原型继承和构造函数是基于原型链的概念。通过在对象之间共享属性和方法,可以实现更高效的内存使用和代码复用。prototype和constructor提供了一种灵活而强大的方式来创建和继承对象,它们是JavaScript非常重要的概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值