首页 > 网站 > 建站经验 > 正文

深入理解JavaScrip t编程中的原型概念

2019-11-02 14:17:19
字体:
来源:转载
供稿:网友

   这篇文章主要介绍了深入理解JavaScript编程中的原型概念,包括prototype属性的使用等一些相关知识,需要的朋友可以参考下

  JavaScript 的原型对象总是让人纠结。即使是经验丰富的JavaScript专家甚至其作者,经常对这一概念给出很有限的解释。我相信问题来自于我们对原型最早的认识。原型总是与new, constructor 以及令人困惑的prototype属性紧密联系。事实上,原型是一个相当简单的概念。为了更好地理解它,我们需要忘记我们所‘学到'的构造原型,然后,追本溯源。

  什么是原型?

  原型是一个从其他对象继承属性的对象。

  是不是任何对象都可以是原型?

  是的

  那些对象有原型?

  每个对象都有一个默认的原型。原型本身就是对象,每一个原型本身也存在一个原型。(只有一个例外,默认的对象原型在每条原型链的顶端,其他的原型在原型链的后面)

  退一步说,什么又是对象呢?

  在JavaScript中一个对象是以键值对保存的任意的无序集合,如果它不是原始类(undefined,null,boolean.nuber或string),它就是一个对象。

  你可以认为每个对象都有一个prototype. 但当我写({}).prototype的时候,我却得到了undefined,你疯不疯?

  忘记你所掌握的关于prototype属性的理解 - 这很可能是迷惑的根源. 一个对象真正的prototype是内部[[Prototype]]属性. ECMA 5介绍了标准的访问方法,Object.getPrototypeOf(object)。这个最新的实现已被Firefox, Safari, Chrome and IE9所支持. 另外,除了IE,所有的浏览器都支持非标准的访问方法__proto__.不然的话,我们只能说对象的构造方法就是它的prototype属性.

  ?

1 2 3 4 5 6 7 8 9 10 11 var a = {};   //Opera 或 IE<=8下失败 Object.getPrototypeOf(a); //[object Object]   //IE下失败 a.__proto__; //[object Object]   //所有浏览器 //(but only if constructor.prototype has not been replaced and fails with Object.create) a.constructor.prototype; //[object Object]

  很好, false 是原始类型, 为什么false.__proto__ 会返回一个值呢?

  当访问原始类型的原型(prototype),它会强制转化为一个对象。

  ?

1 2 //(works in IE<=8 too, due to double-negative) false.__proto__ === Boolean(false).__proto__; //true

  我想使用原型实现继承,我现在该怎么做?

  给一个实例添加原型属性,几乎是没有意义的.除非一种情况,那就是,很有效率的添加属性直接到实例本身.假设我们已经有了一个对象,要共享已经存在的对象的功能.例如Array,我们可以这样做

  ?

1 2 3 4 //fails in IE<=8 var a = {}; a.__proto_ = Array.prototype; a.length; //0

  但是我们可以看到原型的真正强大在于多个实例共享同一原型。原型对象的属性只被定义一次就可以被它引用的所有实例所继承。使用原型对性能和程序可维护性的提高效果是很显而易见的。那么这就是构造函数产生的原因吗?是的,构造函数提供了一个便捷的跨浏览器机制来实现对实例创建时的公用原型分配。。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表