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

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

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

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

什么是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中的对象都有一个秘密属性。 

在我们继续之前,我想讨论一下决定prototype工作方式的“秘密”连接。

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

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

console.log(typeof myObject); // function

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

Function.prototype = {
    arguments: null,
    length: 0,
    call: function(){
        // secret code
    },
    apply: function(){
        // secret code
    }
    ...
} 
当然可能没有这么简单;不过这里只是演示prototype的链式如何工作的。
因此当我们定义myObject为一个方法并且提供一个参数name;但是并不设置其它属性和方法,例如length,和call,那么如下代码为什么可以工作?
...
欢迎访问GBin1.com
原文地址:https://www.cnblogs.com/gbin1/p/2506680.html