代码之家  ›  专栏  ›  技术社区  ›  blu

javascript原型(闭包而不是jquery)

  •  2
  • blu  · 技术社区  · 15 年前

    我刚买了一本关于asp.net和ajax的新书,里面有一个这样的例子:

    Person = function(firstName) {
        this._firstName = firstName;
    }
    
    Person.prototype = {
        get_FirstName = function() {return this._firstName;}
    }
    

    我立刻注意到这并不是我所习惯的,而萤火虫显然同意我的说法,那就是它的怪异。我习惯于这样的事情:

    Person.protoype = {
        get_FirstName: function() {return this._firstName;}
    }
    

    这只是作者的一个错误,还是他可能使用了asp.net ajax库中的一个特性?

    另外,前面的函数与下面的函数是否有区别:

    Person.protoype.get_FirstName = function() {
        return this._firstName;
    }
    

    作者是不是把同一个函数的两个可接受的声明混在一起了?

    4 回复  |  直到 15 年前
        1
  •  2
  •   slebetman    15 年前

    第一个问题,是的,我认为那是个打字错误。

    第二个问题,是的,有区别。不明智的人:

    Constructor.prototype = { method : function(){} }
    

    从匿名对象继承 {} )其中定义了方法。 如果这是第二次,那么前面的方法将消失,因为继承链现在将指向一个新的匿名对象。

    更常见的是:

    Constructor.prototype.method = function(){}
    

    只需定义一个新方法。

        2
  •  1
  •   teepark    15 年前

    对于您的第一个问题,是的,这是一个输入错误-这不是有效的javascript。

    关于你最后一个问题 两个例子之间的区别,如果原型已经附加了一些东西。第一个设置了prototype属性,它将删除先前对prototype所做的任何其他操作,而第二个只添加已经存在的内容。我将使用第二种方法,向原型添加一个新属性。

        3
  •  1
  •   Bjorn    15 年前

    对于问题的第二部分,如果使用“不向原型属性分配新对象”,则可以使用继承:

    Person = function( ) {
    };
    
    Person.prototype = new Individual( );
    
    Person.protoype.set_LastName = function( lastname) {
        this.lastName = lastname
    };
    
    //inherited from Individual:
    Person.get_FirstName( );
    
        4
  •  1
  •   Tim Down    15 年前

    这个例子有几个问题:

    1. Person 应该声明 var . 最好总是对变量这样做。
    2. 其他答案中指出的打字错误。
    3. getter/setter模式,可能受c的属性影响。除非您正在做一些复杂的事情,否则在javascript中这可能是过分的,而且您的代码只需使用一个属性就可以更清晰地显示出来。另外,新的ecmascript 5规范为该语言引入了属性的getter和setter方法,一些浏览器已经实现了它们,但是它们还没有广泛应用到web上。