Jump to content
  • 0

Прототип объекта


DivMan
 Share

Question

Почему при вызове computer.videocard значение не изменилось?

var computer = {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
    };

var mac;
    mac = Object.create(computer);
    mac.videocard = "nvidia"

 

 

Почему, если добавить элемент в массив, то он записывается, а строка нет?

var person = {
name: "Nicholas", 
friends: ["Shelby", "Court", "Van"]
}

var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

person.name     // Nicholas

person.friends   // ["Shelby", "Court", "Van", "Rob"]

Edited by DivMan
Link to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 0

Задание: Создайте экземпляр computer mаc используя Object.create, измените значение свойства videocard чтобы оно было равно "nvidia"

Было

 var computer = {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
    };

 

Я сделал так

 var mac;
    mac = Object.create(computer);
    mac.type = computer.type,
    mac.cpu = computer.cpu,
    mac.videocard = "nvidia"

Правильно?

 

Проверка вот такая 

assert.equal(mac.type, computer.type);
assert.equal(mac.cpu, computer.cpu);
assert.equal(mac.videocard, "nvidia");

 

Link to comment
Share on other sites

  • 0
34 минуты назад, DivMan сказал:

 

Задание: Создайте экземпляр computer mаc используя Object.create, измените значение свойства videocard чтобы оно было равно "nvidia"

Было


 var computer = {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
    };

 

Я сделал так


 var mac;
    mac = Object.create(computer);
    mac.type = computer.type,
    mac.cpu = computer.cpu,
    mac.videocard = "nvidia"

Правильно?

 

Не понимаю, зачем вам при таком раскладе сохранять св-ва computer в прототипе

Link to comment
Share on other sites

  • 0
5 часов назад, DivMan сказал:

Вот создал я прототип, и так и не понял для чего они, отнимают столько же времени, для создания свойства обычным способом.

https://jsfiddle.net/e89zj0zj/

Используя прототип, каждый экземпляр ссылается на одну и ту же функцию. Эта функция существует в памяти только один раз и все ссылаются на нее при использовании.
При объявлении метода в конструкторе при создании нового экземпляра будет создаваться новая функция.
Возможно, дело в производительности.

Edited by Igor Schnaider
Link to comment
Share on other sites

  • 0

Почему в консоле не отображается созданное свойство?

 

function User(name, age){
this.name = name;
this.age = age;
this. admin = false;
}

var u1 = new User("Vasya", 22);

User.prototype.x = 10;

u1

должно быть так: User {name: "Vasya", age: 22, admin: false, x: 10}

Link to comment
Share on other sites

  • 0
В 07.04.2016 в 16:26, DivMan сказал:

Почему в консоле не отображается созданное свойство?

 


function User(name, age){
this.name = name;
this.age = age;
this. admin = false;
}

var u1 = new User("Vasya", 22);

User.prototype.x = 10;

u1

должно быть так: User {name: "Vasya", age: 22, admin: false, x: 10}

Так ведь работает все https://jsfiddle.net/7qjc39hz/

В 07.04.2016 в 19:35, DivMan сказал:

Почему не удаляется прототип?

 


var F = function () {
this.a = 1;
}

var f = new F();

F.prototype.a = 44

f.a = 33

delete f.a

delete f.a

delete f.a

 

Я кажись начинаю понимать

Через объект по моему нельзя перезаписать или удалить свойства в прототипе (по крайней мере я не знаю как).

Можно поменять ссылку указывающую на прототип https://jsfiddle.net/xytfdkcv/

но если в прототипе несколько св-в, они все станут недоступными для f

Link to comment
Share on other sites

  • 0

Почему ResetableCounter is not defined?

function Counter(init){
    this.init = init;
    this.counter = init;
}
 
Counter.prototype.inc = function(){
        this.counter++
}
 
ResetableCounter.prototype = Object.create(Counter.prototype)
 
ResetableCounter.prototype.reset = function(){
    this.counter = this.init
}
 
let c = new ResetableCounter(100)
c.inc()
c.inc()

 

Link to comment
Share on other sites

  • 0
3 часа назад, DivMan сказал:

Задача: не должно быть дублирования кода из методов оригинального калькулятора.
Как унаследовать цикл?

Советую использовать синтаксические конструкции (сахар) текущего стандарта ECMAScript 2015 для реализации ООП. Не надо забивать голову тем, чем ее можно не забивать. А в освободившуюся ячейку памяти запиши что-нибудь полезное =)

https://jsfiddle.net/e1s7d3z7/1/

  • Like 1
Link to comment
Share on other sites

  • 0
13 часа назад, nerv сказал:

текущего стандарта ECMAScript 2015

1. поправка, текущий стандарт уже ECMAScript 2016

2. реализацию метода sum() класса Calculator приведенного по моей предыдущей ссылке можно упростить еще:

class Calculator {
  constructor(n) {
  	this.n = n;
  }
  sum(...nums) {
    return nums.reduce((sum, k) => sum + k, this.n);
  }
}

 

Link to comment
Share on other sites

  • 0

Я хочу сделать, через прототипы, но не получается https://jsfiddle.net/e1s7d3z7/3/

106*106 = 11236

 

А у меня получается, складывается не сумма аргументов, а количество и получается 10609

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

Link to comment
Share on other sites

  • 0

Правильно ли я понял, то, что после вызова spot.sit(); у объекта spot, создаётся своё личное свойство sit? И теперь, если ещё раз его вызвать, оно будет браться не из прототипа, а на прямую? То есть свойство добавляется в конструктор? 

http://plnkr.co/edit/pWlbvzN3Up5rRyUgtkcw?p=preview

Edited by DivMan
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy