首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript原型继承中,数组和数字数据类型是否有区别?

在Javascript原型继承中,数组和数字数据类型是否有区别?
EN

Stack Overflow用户
提问于 2014-04-14 16:38:45
回答 3查看 78关注 0票数 1

我是javascript原型继承的书呆子。我能理解下面代码中发生的事情。

代码语言:javascript
复制
function Hamster() {  }
Hamster.prototype = {
  food: [],
  found: function(something) {
    this.food.push(something)
  }
}

// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()

speedy.found("apple")
speedy.found("orange")

alert(speedy.food.length) // 2

下面的行也提醒2 b‘z,因为两个对象都在共享Hamster原型中的food数组。

代码语言:javascript
复制
alert(lazy.food.length) // 2

但是,如果我将数组的数据类型更改为number,则food键不会在两个实例之间共享。

代码语言:javascript
复制
function Hamster() {  }
Hamster.prototype = {
  food: 0,
  found: function(something) {
    this.food = something
  }
}

// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()

speedy.found(123)


alert(speedy.food) // 123

但是下面这一行提醒0,你能告诉我为什么不通知123吗?

代码语言:javascript
复制
alert(lazy.food) // 0
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-14 16:44:31

Hamster的每个实例都有自己的food属性。但是在第一个版本中,它们都指向相同的数组,您正在用push对其进行修改。在第二个版本中,它们指向整数,这些整数不能被修改;found函数重新分配实例的属性,这对其他实例没有任何影响。

要为每个实例提供自己的food数组属性,您需要使用赋值它的构造函数。

下面可以看到类似的行为,它只使用普通变量而不是对象和继承。

代码语言:javascript
复制
arr1 = [];
arr2 = arr1;
arr1.push(1);
console.log(arr2); // prints [1]

int1 = 0;
int2 = int1;
int1 = 1;
console.log(int2); // prints 0

赋值运算符'=‘从变量中移除指针

代码语言:javascript
复制
arr1 = [];
arr2 = arr1;
arr2 = ['Appple'];
console.log(arr1); // prints []
票数 3
EN

Stack Overflow用户

发布于 2014-04-14 16:41:12

在JavaScript中,属性查找遵循原型链,而不是属性赋值。

所以,当你说

代码语言:javascript
复制
this.food = something;

在对象上创建food属性。因此,它从food中重写prototype。但是当您访问lazy时,因为它是属性查找,所以首先搜索当前对象,然后搜索原型,在原型中定义它并为其赋值0。这就是它提醒0的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-04-14 16:57:25

需要理解的是,在第一种情况下,两个对象对于food仍然有自己的值;只是在每种情况下,它们的值都是对内存中相同对象的引用,因此将项推到该属性引用的数组中会更改相同的数组。

@Barmar的回答,我投了赞成票,已经说了所有这些,但这里还有另一个例子,应该有助于证明这一点:

代码语言:javascript
复制
function Hamster() {}

Hamster.prototype = {
    food: [],
    found: function(something) {
        this.food = something;
    }
}

// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()

speedy.found(["apple"])
speedy.found(["orange"])

alert(speedy.food) // orange
alert(lazy.food) // <empty>

在本例中,每个food属性都获得对不同数组的引用,因此很明显,每个属性都是独立的。

要带走的关键是:

保存对象的变量的值是对该对象的引用。包含原语(如数字)的变量的值是原语本身的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23065542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档