javascript基于原型的语言的特点

一、基于原型的语言的特点

 

1 只有对象,没有类;对象继承对象,而不是类继承类。

 

2  “原型对象”是基于原型语言的核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。

 

 

二、基于原型的语言中对象的创建

创建有两个步骤

 

1. 使用"原型对象"作为"模板"生成新对象

这个步骤是必要的,这是每个对象出生的唯一方式。以原型为模板创建对象,这也是"原型"(prototype)的原意。

 

2. 初始化内部属性

这一步骤不是必要的。通俗点说,就是,对"复制品"不满意,我们可以"再加工",使之获得不同于"模板"的"个性"。

 

三、原型,为复用代码而生

 

四、继承

 

 

五、小结

 

1.原型的本质就是对象引用原型对象的属性,实现代码复用。

 

2.基于原型的语言是以原型对象为模板创建对象。

 

js是世界上最容易被误解的语言,原因主要有两个:

 

1) 作为基于原型的语言中,却连最基本的一个通过原型产生对象的函数都没有,让人不知道js根本上是以对象创建对象。

 

2) 使用new关键字创建对象,让人误会js是以类似java类的构造函数创建对象,实际上,构造函数在创建对象上起到次要的作用,甚至不需要,重要的只有函数的属性prototype引用的原型对象,新对象以此为模板生成,生成之后才调用函数做初始化的操作,而初始化操作不是必要的。

 

记:js的面向对象是基于原型的面向对象,对象创建的方式根本上只有一种,就是以原型对象为模板创建对象,new function不是通过函数创建对象,只是刻意模仿java的表象。

 

 

七、javascript的原型本质,理解javascript的构造器模式

1.理解js的使用(new关键字+函数)的创建对象方式,new func()。

function Admin(name){ 

    this.name = name; 

    this.getName = function(){return this.name}; 

var admin= new Admin('Sn'); 

分析上面代码。

 

javascript引入new关键字是为了模仿java创建对象的方式,通过语句var admin = new Admin('Sn') 就生成了一个admin对象。

 

我们知道,基于原型的语言生成一个步骤有两步:

第一步是使用"原型对象"作为"模板"生成新对象,

第二步是初始化新对象的内部属性。

 

我们敢肯定地推断,javascript中的new Admin('Sn');必然做了这两件事情,那么

 

1 "原型对象"在哪里?

 

2 怎么做到"初始化新对象的内部属性"?

 

答案是,admin.prototype就是我们要找的"原型对象",通过"以新对象代替this,执行admin函数"做到了"初始化新对象的内部属性"。

 

使用new+function的方式创建对象,其实就是应用我们设计的函数newInstance(实例化)时的思想;

function newInstance(constructor){ 

        var obj = {}; 

        obj.__proto__ = constructor.prototype; 

        constructor.call(obj,sliceArguments(arguments,1)); 

        return obj; 

}

 

八. javascript构造器模式的特点

 

1) javascript的顶层对象是Object.prototype

 

2) 所有对象有一个__proto__属性。__proto__指向自己的"原型对象",搜索属性的原型链以__proto__为基础。

 

3) 每个函数都会默认关联一个原型对象。javascript每创建一个函数的时候,都同时创建一个原型对象,赋值到函数的prototype属性,用作使用new  生成实例对象的默认原型对象。该默认原型对象的内容是

 

    __proto__:Object.prototype, 

    constructor: 指向函数本身 

}

__proto__指向Object.prototype的目的是为了使生成的实例对象继承顶层对象Object.prototype;

 

而constructor指向函数本身的目的是为了使生成的实例对象newObject可以直接通过newObject.constructor访问到构造函数,同时构造函数和原型对象可以互相访问也是个良好的设计。但是,实际上,constructor并没有什么用,所以大家可以不理会这个属性,这仅仅是一个优化的设计。

 

4) 可以修改或替换构造函数都会默认关联的原型对象。

function A(){}; 

function B(){}; 

B.prototype = new A();           //原型对象为 new A()对象

B.prototype.constructor = A;        //构造函数为A函数,可选

 

六、javascript对象继承体系结构

1) 所有对象都有自己的原型对象。

 

2)所有构造函数的原型对象都是Function.prototype,Object.prototype是最顶层的对象。

 

3) 通过原型继承,所有对象构成了一个完整的系统

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值