📌  相关文章
📜  教资会网络 | UGC NET CS 2018 年 7 月 – II |问题 46(1)

📅  最后修改于: 2023-12-03 15:39:56.023000             🧑  作者: Mango

UGC NET CS 2018 年 7 月 - II |问题 46

UGC NET计算机科学考试是一项全印度水平的考试,旨在考察考生对计算机科学和应用的深度理解。 问题46是关于javascript中的__proto__的问题,它是一个很好的例子,可以向程序员展示在实际编程中需要掌握的基本概念。

问题描述

在Javascript中,下面的语句返回什么?

var Animal = {
  speak: function() {
    console.log("Animal is speaking");
  }
};

var Dog = {
  bark: function() {
    console.log("Dog is barking");
  }
};

Dog.__proto__ = Animal;

var myDog = Object.create(Dog);
myDog.bark();
myDog.speak();

A) Dog is barking followed by undefined

B) Dog is barking followed by Animal is speaking

C) undefined followed by Dog is barking

D) Animal is speaking followed by Dog is barking

解析问题

问题问的是当我们在一个Javascript对象中使用__proto__属性时会发生什么。__proto__属性是Javascript中特殊的属性之一,它影响对象的继承。Javascript支持原型链,每个对象都有一个原型对象,也可以继承来自其他对象。当对象调用函数或访问属性时,Javascript引擎沿着原型链向上查找,直到找到所需的函数或属性或遍历到原型对象的顶部。

例如,当我们在一个对象中引用一个函数时,Javascript引擎会首先查找该对象本身是否拥有该函数,如果未找到,它将查找该对象的原型对象,如果未找到,则继续在原型对象上查找直到查找到一个函数或原型链结束。

在这个问题中,我们先定义了两个对象:一个名为Animal,一个名为Dog。然后,我们将Dog的__proto__属性设置为Animal以实现继承。最后,我们使用Object.create()方法来创建一个名为myDog的对象,该对象从Dog继承而来。

我们需要确定的是,在调用myDog.bark()之后,调用myDog.speak()会发生什么。为了确定,我们需要了解继承如何工作。

由于我们在Dog的原型中设置了Animal,因此在找不到某个函数时,Javascript引擎将在Animal的原型中继续查找。在这种情况下,speak()函数在Animal的原型中,因此当我们在myDog对象上调用speak()函数时,Animal的speak()函数被调用,并打印出"Animal is speaking"。

因此,正确答案为B) Dog is barking followed by Animal is speaking

返回的代码片段
var Animal = {
  speak: function() {
    console.log("Animal is speaking");
  }
};

var Dog = {
  bark: function() {
    console.log("Dog is barking");
  }
};

Dog.__proto__ = Animal;

var myDog = Object.create(Dog);
myDog.bark();
myDog.speak();
结论

此问题向程序员展示了Javascript中原型继承的概念,同时向ACM UGC NET CS考生展示了在一次计算机科学考试中必须掌握的基本概念。熟悉原型链和__proto__属性,将对程序员实际编程中的问题解决有很大帮助。