草庐IT

javascript - jQuery 或 JavaScript 有类和对象的概念吗?

coder 2023-08-01 原文

我在某处找到了以下代码,但我没有正确理解这些代码。

ArticleVote.submitVote('no');return false;

ArticleVote 是一个类,submitVote() 是那个类的函数吗?

或者上面的代码是什么意思? jQuery 或传统 JavaScript 中有类和对象的概念吗?如何创建它们?请分享一些引用链接或代码。

最佳答案

JavaScript 中万物皆对象

与其他声称的纯 OOP 语言相反。函数也是对象,但它们也可以是对象的构造函数。

var ObjectCreator = function () {
};

上面是一个函数,如果调用得当,它会创建一个对象。 适当调用 意味着您必须使用 new 运算符:

var obj = new ObjectCreator;

因此,虽然 JavaScript 本身没有类,但有模拟该行为的方法。例如:

class Foo {
    public void bar() {}
}

Foo foo = new Foo();

相当于下面的JS代码:

var Foo = function () {
    // constructor
};

Foo.prototype.bar = function () {}

var foo = new Foo;

继承不同

当您想使用继承时,真正的区别就来了,这是一种不同类型的继承(原型(prototype))。因此,给定两个伪类 Foo 和 Bar,如果我们希望 Bar 从 Foo 扩展,我们必须这样写:

var Foo = function () {};
var Bar = function () {};

Bar.prototype = new Foo; // this is the inheritance phase

var bar = new Bar;

alert(bar instanceof Foo);

对象字面量

虽然构造函数很有用,但有时我们只需要该对象的一个实例。编写一个构造函数然后用属性和方法填充它的原型(prototype)在某种程度上是乏味的。所以 JavaScript 有对象字面量,它们是某种哈希表,只是它们是自觉的。 self-conscious 我的意思是他们知道 this 关键字。对象字面量是实现单例模式的好方法。

var john = {
    age : 24,

    isAdult : function () {
        return this.age > 17;
    }
};

上面,使用构造函数等同于:

var Person = function (age) {
    this.age = age;
};

Person.prototype.isAdult = function () {
    return this.age > 17;
};

var john = new Person(24);

那个prototype 东西怎么样

正如许多人所说,在 JavaScript 中对象继承自对象。这件事有一些有用的方面,其中之一可以称为 寄生继承(如果我没记错的话,Douglas Crockford 提到这个的上下文)。不管怎样,这个原型(prototype)概念与原型(prototype)链的概念有关,类似于经典OO语言中的父->子链。所以,继承的东西。如果在 foo 对象上调用了 bar 方法,但该对象没有 bar 方法,则开始成员查找阶段:

var Baz = function () {};

Baz.prototype.bar = function () {
    alert(1);
};

var Foo = function () {};
Foo.prototype = new Baz;

var foo = new Foo;

/*
 * Does foo.bar exist?
 *      - yes. Then execute it
 *      - no
 *          Does the prototype object of the constructor function have a bar
 *          property?
 *              - yes. Then execute it
 *              - no
 *                  Is there a constructor function for the prototype object of
 *                  the initial construct function? (in our case this is Baz)
 *                      - yes. Then it must have a prototype. Lookup a bar
 *                        member in that prototype object.
 *                      - no. OK, we're giving up. Throw an error.
 */
foo.bar();

等一下,你说的是寄生继承

经典 OO 继承与基于原型(prototype)的继承之间存在一个关键区别。当对象从对象继承时,它们也继承状态。举个例子:

var Person = function (smart) {
    this.smart = smart;
};

var Adult = function (age) {
    this.age = age;
};

Adult.prototype = new Person(true);

var john = new Adult(24);

alert(john.smart);

我们可以说john是一个匿名人的寄生虫,因为它无情地吸食着这个人的智慧。此外,鉴于上述定义,所有 future 的成年人都会很聪明,不幸的是,这并不总是正确的。但这并不意味着对象继承是一件坏事。只是一个工具,和其他任何东西一样。我们必须按我们认为合适的方式使用它。

在经典的 OO 继承中,我们不能执行上述操作。我们可以使用静态字段来模拟它。但这会使该类的所有实例对该字段具有相同的值。

关于javascript - jQuery 或 JavaScript 有类和对象的概念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073864/

有关javascript - jQuery 或 JavaScript 有类和对象的概念吗?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  4. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  7. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  8. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

随机推荐