Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery等实例化_Javascript_Jquery_Oop - Fatal编程技术网

Javascript jQuery等实例化

Javascript jQuery等实例化,javascript,jquery,oop,Javascript,Jquery,Oop,OOP通常需要实例化(在使用之前创建类的实例),如下所示: var x = new String(); 在jQuery(和其他框架)中,我们可以使用对象而无需实例化,例如(无“新建”): 我的问题是:框架作者是如何做到的??如何在没有“新”实例化的情况下使框架准备好使用 提前谢谢 javascript是一种不存在继承的语言,所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的 在您给出的示例中 $('#myid').click(function(){ //code }); 实际上,您

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

var x = new String();
在jQuery(和其他框架)中,我们可以使用对象而无需实例化,例如(无“新建”):

我的问题是:框架作者是如何做到的??如何在没有“新”实例化的情况下使框架准备好使用

提前谢谢

javascript是一种不存在继承的语言,所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的

在您给出的示例中

$('#myid').click(function(){
//code
});
实际上,您正在向
click
函数传递一个匿名函数,该函数定义为jQuery库定义的对象上的内部函数,该函数是通过全局参数化
$
函数创建的(该函数内部使用@lwburk在回答中指出的
new
)。函数是javascript中的第一类公民-它们可以直接使用,也可以作为对象的一部分使用,这使它们看起来像是外部对象中的方法:

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

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

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

(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."

最简单的答案(忽略了JavaScript与基于类的语言的区别)是创建一个新对象并从jQuery函数返回

(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."
您将在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);

由于JS是原型、函数和类,因此
new
关键字与其他语言略有不同

两者的区别

var D = new 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"

根据Crockford学派的观点,要接受JavaScript真正的原型本质,必须废除伪经典元素,如
new
操作符或
.prototype
引用

虽然lwburk在jQuery中的这一点是正确的,
$()
只是一个包装器,但您实际上可以“实例化”一个对象,而不必使用
new

var myClass = function () {
  var privateVar,

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

  return instance;
};

var newInstance = myClass();

但是“新”呢??通常使用“新建”创建实例!大多数情况下都不需要它。@DrStrangeLove-Daniel说得对,严格地说,JavaScript中不需要
new
,但实际上jQuery使用
new
来创建一个新对象,该对象被分配给
jQuery
$
对象。看我的答案。你说“通过克隆对象(原型)”是什么意思?如果你说为每个实例创建了一个重复的prototype对象,那是不对的。@patrick看起来我也需要对javascript原型进行复习,你之前的回答非常有用。我不知道你问的是
“#myid”
字符串还是jQuery对象。你在这里写的东西在很多方面都是错误的。首先,为了按预期工作,myClass应该是一个函数,而不是一个文本对象。即使您纠正了这一点,您也会无意中创建一个全局变量实例。最后一点不是是否使用
new
:这只是调用函数的一种不同方式(即,
newfoo()
通常不等同于
foo())
。你不应该废除
new
而继续使用构造函数。你能做的就是尽量避免使用构造函数,而只将它们用于继承。此注释太短,无法在这一点上展开。对不起,我确实忘记了函数头。请给我指一些在此基础上展开的资源。我很好奇。
var myClass = function () {
  var privateVar,

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

  return instance;
};

var newInstance = myClass();