实例化

时间:2011-02-23 02:35:06

标签: javascript jquery oop

OOP通常需要实例化(在使用之前创建类的实例),如下所示:

var x = new String();

在jQuery(和其他框架)中,我们可以使用没有实例化的对象,例如(没有'new'):

$('#myid').click(function(){
//code
});

这是我的问题:框架作者如何制作?如何在没有“新”实例化的情况下使框架可以使用?

提前致谢!!

6 个答案:

答案 0 :(得分:5)

最简单,最有用的答案(遗漏了很多关于JavaScript与基于类的语言的不同之处)是从jQuery函数创建并返回一个新对象

您将在jQuery源代码中看到的第一件事:

var jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );
}

您可以看到$只是源代码中jQuery的别名:

// Expose jQuery to the global object
return (window.jQuery = window.$ = jQuery);

答案 1 :(得分:3)

javascript是prototype based language,没有继承 - 所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的。

在你给出的例子中

$('#myid').click(function(){
//code
});

你实际上是将一个匿名函数传递给click函数,该函数被定义为jQuery库定义的对象的内部函数 - 它是通过全局参数化$函数创建的(内部函数)使用new,正如@lwburk在他的回答中指出的那样)。函数是javascript中的一等公民 - 它们可以直接使用,也可以作为对象的一部分使用,然后使它们看起来好像是外部对象中的方法:

 [object returned by function]
 $            ('#myid')       .click(          function() {} );
 ^             ^               ^
 function      parameters      inner function  ^ parameter of type function

答案 2 :(得分:2)

您可以创建一个包含自调用函数的方法。

(function() {
    var iAm = window.iAm || {};

    iAm = {
        Awesome: function()
        {
            alert('Yea you are!');
        },

        Lame: function()
        {
            alert('aww man.');
        }
    };

    window.iAm = iAm;

})();

iAm.Awesome(); // will alert "Yea you are!"
iAm.Lame(); // will alert "aww man."

答案 3 :(得分:0)

JavaScript是一种动态的,脚本化的,基于原型的语言。实例化和内存管理来自解释器。

答案 4 :(得分:0)

由于JS是原型,功能和无类,因此new关键字与其他语言略有不同。

之间的区别
var D = new Dog();

var D = Dog();

使用new关键字将返回它正在调用的对象。

考虑一下:

function Dog() {

  // a property
  this.breed = "chocolate lab";

  // a method
  this.bark = function(){
    alert("woof");
  }
}

然后你可以调用方法并从对象中提取属性。

var D = new Dog();

    D.breed; // [string] 'chocolate lab'
    D.bark(); // alerts "woof"

答案 5 :(得分:0)

根据Crockford学校的说法,要接受JavaScript的真正原型性质,你必须废除伪古典元素,例如new运算符或.prototype引用。

虽然lwburk在jQuery中是正确的,$()只是一个包装器,但实际上你可以在没有new的情况下“实例化”一个对象。

var myClass = function () {
  var privateVar,

  instance = {
    member: 'foo',
    method: function () {
      privateVar = 'bar';
    }
  };

  return instance;
};

var newInstance = myClass();