• 了解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
  • 相关阅读:
    SpringMVC请求参数接收总结(一)
    不用 Spring Security 可否?试试这个小而美的安全框架
    @ConfigurationProperties 注解使用姿势,这一篇就够了
    Spring Aware 到底是什么?
    git rebase VS git merge? 更优雅的 git 合并方式值得拥有
    Spring Bean 生命周期之destroy——终极信仰
    面试还不知道BeanFactory和ApplicationContext的区别?
    Java设计模式学习记录-享元模式
    Java设计模式学习记录-外观模式
    Java设计模式学习记录-装饰模式
  • 原文地址:https://www.cnblogs.com/gbin1/p/2506680.html
Copyright © 2020-2023  润新知