当前位置: 首页 > 面试题库 >

JavaScript中的类与静态方法

扶冠宇
2023-03-14
问题内容

我知道这会起作用:

function Foo() {};
Foo.prototype.talk = function () {
    alert('hello~\n');
};

var a = new Foo;
a.talk(); // 'hello~\n'

但是如果我想打电话

Foo.talk() // this will not work
Foo.prototype.talk() // this works correctly

我找到一些Foo.talk工作方法,

  1. Foo.__proto__ = Foo.prototype
  2. Foo.talk = Foo.prototype.talk

还有其他方法吗?我不知道这样做是否正确。您在JavaScript代码中使用类方法还是静态方法?


问题答案:

首先,请记住JavaScript主要是一种原型语言,而不是基于类的语言1。Foo不是一个类,而是一个函数,这是一个对象。您可以使用关键字从该函数实例化一个对象,该new关键字将允许您使用标准OOP语言创建类似于类的内容。

我建议__proto__大部分时间都忽略它,因为它对跨浏览器的支持很差,而应该专注于了解其prototype工作原理。

如果您有一个从函数2创建的对象的实例,并且以任何方式访问其成员之一(方法,属性,属性,常量等),则访问将沿原型层次结构进行,直到(a)找到成员,或(b)找不到其他原型。

层次结构从被调用的对象开始,然后搜索其原型对象。如果原型对象具有原型,则重复该操作(如果不存在原型),undefined则返回该对象。

例如:

foo = {bar: 'baz'};
console.log(foo.bar); // logs "baz"

foo = {};
console.log(foo.bar); // logs undefined

function Foo(){}
Foo.prototype = {bar: 'baz'};
f = new Foo();
console.log(f.bar);
// logs "baz" because the object f doesn't have an attribute "bar"
// so it checks the prototype
f.bar = 'buzz';
console.log( f.bar ); // logs "buzz" because f has an attribute "bar" set

在我看来,您已经至少已经对这些“基本”部分有所了解,但是为了确保它们,我需要使它们明确。

在JavaScript中,一切都是对象3。

一切 都是对象。

function Foo(){}不仅定义了一个新函数,还定义了一个可以使用访问的新函数对象Foo

这就是为什么您可以使用来访问Foo的原型的原因Foo.prototype

你也可以做的是设置 更多的功能Foo

Foo.talk = function () {
  alert('hello world!');
};

可以使用以下方式访问此新功能:

Foo.talk();

我希望到目前为止,您已经注意到函数对象上的函数与静态方法之间的相似性。

可以将其f = new Foo();视为创建类实例,Foo.prototype.bar = function(){...}为该类定义共享方法以及为该类Foo.baz = function(){...}定义公共静态方法。

ECMAScript 2015为此类声明引入了多种语法糖,以使其更易于实现,同时也更易于阅读。因此,前面的示例可以写成:

class Foo {
  bar() {...}

  static baz() {...}
}

它可以bar被称为:

const f = new Foo()
f.bar()

并被baz称为:

Foo.baz()

1:class是ECMAScript5规范中的“未来保留字”,但是ES6引入了使用class关键字定义类的功能

2:本质上是由构造函数创建的类实例,但是有很多细微的差别我不想误导你

3:基本值(包括undefined,,null布尔值,数字和字符串)在技术上不是对象,因为它们是低级语言实现。布尔值,数字和字符串仍然像它们是对象一样与原型链交互,因此,出于此答案的目的,即使它们不是完全一样,也更容易将它们视为“对象”。



 类似资料:
  • 问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做

  • 问题内容: 在Java中,我希望具有以下内容: 但是我明白了 我对基本用途以外的泛型没有什么了解,因此对此没有多大意义。我无法在互联网上找到有关该主题的很多信息,这无济于事。 有人可以通过类似的方式澄清这种使用是否可行吗?另外,为什么我最初的尝试失败了? 问题答案: 你不能在静态方法或静态字段中使用类的泛型类型参数。该类的类型参数仅在实例方法和实例字段的范围内。对于静态字段和静态方法,它们在类的所

  • 我为之编写的测试用例: 我还有最后一节课。 我已经在测试类中添加了以下代码: 但对我来说什么都不起作用。请建议在类中模仿方法的正确方法。

  • 在讲类方法和静态方法之前,先来看一个简单的例子: class A(object): def foo(self): print 'Hello ', self >>> a = A() >>> a.foo() Hello, <__main__.A object at 0x10c37a450> 在上面,我们定义了一个类 A,它有一个方法 foo,然后我们创建了一个对象 a,并调用

  • 本文向大家介绍PHP中类属性与类静态变量的访问方法示例,包括了PHP中类属性与类静态变量的访问方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP中类属性与类静态变量的访问方法。分享给大家供大家参考,具体如下: 运行结果为:hello world 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数学运算技巧总结》、《PHP数组(Arr

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是