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
  On 3/31/2016 at 8:59 AM, DivMan said:

 

Задание: Создайте экземпляр 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"

Правильно?

 

Expand  

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

Link to comment
Share on other sites

  • 0
  On 4/3/2016 at 7:18 PM, DivMan said:

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

https://jsfiddle.net/e89zj0zj/

Expand  

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

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
  On 4/8/2016 at 12:26 PM, DivMan said:

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

 

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}

Expand  

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

  On 4/8/2016 at 3:35 PM, DivMan said:

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

 

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

 

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

Expand  

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

Можно поменять ссылку указывающую на прототип 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
  On 8/19/2016 at 3:45 PM, DivMan said:

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

Expand  

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

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

  • Like 1
Link to comment
Share on other sites

  • 0
  On 8/19/2016 at 7:31 PM, nerv said:

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

Expand  

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