JavaScript / добавить функцию к прототипу в repl.it - PullRequest
1 голос
/ 29 апреля 2020

Я следую этому уроку .

function Bear(type){
  this.type = type;
}

Bear.prototype.growl = function(){
  console.log('grrr')
}

var grizzly = new Bear('grizzly')
var bBear = new Bear('bBear')

console.log(grizzly, bBear, Bear.growl)

результат этого может быть:

{
  "type": "grizzly",
  "growl": function(){
  console.log('grrr')
}
} {
  "type": "bBear",
  "growl": function(){
  console.log('grrr')
}
} undefined

но то, что я получаю в repl. это is:

Bear { type: 'grizzly' } Bear { type: 'bBear' } 

Если я помещу тот же код в фрагмент кода SO, результат будет правильным.

Почему я получаю другие результаты здесь?

1 Ответ

1 голос
/ 29 апреля 2020

Это артефакт того, как разные среды регистрируют объекты. При переполнении стека фрагменты стека регистрируют перечисляемые свойства в любом месте в цепочке прототипов объекта:

const theProto = { protoProp: 'val' };
const theInstance = Object.create(theProto);
theInstance.instanceProp = 'val';

console.log(theInstance);

Тот же код в узле регистрирует только свойства непосредственно на объекте :

{ instanceProp: 'val' }

И repl.it запускает код через Node.

Аналогично, с вашим фрагментом, поскольку свойство growl находится в объекте prototype , когда вы регистрируетесь bBear, вы увидите growl в фрагменте стека, но нет, если вы запустите тот же код в Node.

Фактический объект в Javascript один и тот же, независимо от вашей среды - вы не делает ничего плохого.

Ведение журнала не стандартизировано. Это зависит от двигателя.

...