了解javascript编程中的Prototype(原型)

日期:2012-5-16  来源:GBin1.comjavascript

了解javascript编程中的Prototype(原型)

当你定义javascript方法的时候,会产生一些预约义的属性,其中一个比较让人迷惑的属性就是prototype。在本文中,咱们将详细介绍什么是Prototype,而且为何使用prototype。java

什么是prototype?

prototype属性初始时是一个空的对象,能够添加对象 ,你能够添加任何对象到它里面去。编程

var myObject = function(name){
    this.name = name;
    return this;
};
console.log(typeof myObject.prototype); // object
myObject.prototype.getName = function(){
    return this.name;
};

在以上这段代码中,咱们建立了一个方法,可是若是咱们调用myObject(),将会返回window对象,由于它被定义在全局范围中。 this将会返回全局对象,由于没有被实例化。浏览器

console.log(myObject() === window); // true

秘密的链接

每个javascript中的对象都有一个秘密属性。 app

在咱们继续以前,我想讨论一下决定prototype工做方式的“秘密”链接。this

每个javascript对象在定义或者实例化的时候都会添加一个秘密的属性,叫__proto__,这决定了prototype链如何被访问。然而,在你的应用中访问这个__proto__属性绝对不是一个好主意,由于不是全部浏览器均可访问。spa

__prototype__ 属性在一个对象的prototype中不该该被弄混了, 由于它有两个分开的属性;意味着他们都是手拉手来使用的。对于弄清楚这个很重要。由于最开始的时候确定比较使人迷惑。 那究竟什么意思呢? 这里咱们解析一下。 当咱们建立myObject方法时,咱们定义了一个Function类型的对象。prototype

console.log(typeof myObject); // function

若是你不知道的话, Function是一个javascript预约义的对象,这样的话,拥有本身的属性(例如,length和arguments)和方法(例如,call和apply)。这意味着,在javascript的引擎中,这里有相似以下代码的部分:code

Function.prototype = {
    arguments: null,
    length: 0,
    call: function(){
        // secret code
    },
    apply: function(){
        // secret code
    }
    ...
} 
固然可能没有这么简单;不过这里只是演示prototype的链式如何工做的。
所以当咱们定义myObject为一个方法而且提供一个参数name;可是并不设置其它属性和方法,例如length,和call,那么以下代码为何能够工做?
....
....
来源: 了解javascript编程中的Prototype(原型)
相关文章
相关标签/搜索