Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2019, 12:08
Интересующийся
Отправить личное сообщение для ProgYoung Посмотреть профиль Найти все сообщения от ProgYoung
 
Регистрация: 08.05.2019
Сообщений: 25

Создание одного частного свойство для объекта потомка
Как работает код:

Класс-родитель и его поля (Numbers()): Три вещественных числа x,y,z
Функция-метод 1 обработки данных: Вычислить среднее геометрическое чисел
Функция-метод-2 обработки данных: Определить, сколько цифр содержит сумма заданных трех чисел

Класс-потомок и его поля(New_three()): Два набора чисел: еще три вещественных числа a,b,c
Функция-метод обработки данных класса-потомка: определить скалярное произведение двух наборов чисел

Для New_three() нужно создать одно частное свойство. Знаю, что нужно использовать get или set, но меняя, код перестает работать. Я правильно понимаю, что функцию Product нужно менять? Ведь частное свойство - это свойство, к которому нельзя обратиться по имени?

function Numbers(params){
    for (var i =1; i<params.length; i++) {
        if (i==4) break;
        if (i==3) continue;
        if (typeof params[i] != "number") throw new Error("Error");
    }
    for (var i = 0; i<params.length; i++) {
        if (i==0) this.x = params[0];
        if (i==1) this.y = params[1];
        if (i==2) this.z = params[2];
		if (i==3) this.middle = params[3];
		if (i==4) this.summa = params[4];
    }
    this.GeometricMean = function(){this.middle = (this.x+this.y+this.z)/3;}
}
Numbers.prototype = new Numbers(this.x = 0, this.y = 0, this.z = 0, this.middle = 0, this.summa = 0);
Numbers.prototype.constructor = Numbers;

Numbers.prototype.DigitSumm = function(){var kol = this.x+this.y+this.z; this.summa = kol.toString().length;}


function New_three(params){
    Numbers.apply(this, arguments);
    for (var i =1; i<params.length; i++) {
        if (i==3) break;
        if (i==2) continue;
        if (typeof params[i] != "number") throw new Error("Error");
    }
    for (var i = 0; i<params.length; i++) {
        if (i==0) this.a = params[0];
        if (i==1) this.b = params[1];
        if (i==2) this.c = params[2];
        if (i==3) this.product = params[3];
    }
    this.Product = function(){this.product = this.a * this.b + this.b * this.c;}
}

// наследование
New_three.prototype = new Numbers([12.1, 10.5, 20.0, 0, 0]);
New_three.prototype.constructor = New_three;

var numbers = new Numbers([12.1, 10.5, 20.0, 0, 0]);
var chisla = new New_three([7.7, 8.5, 9.2, 0]);
reload();
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2019, 12:16
Интересующийся
Отправить личное сообщение для ProgYoung Посмотреть профиль Найти все сообщения от ProgYoung
 
Регистрация: 08.05.2019
Сообщений: 25

А если я просто переименую this.Product в this.getProduct, это будет считаться частным свойством?
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2019, 13:46
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Цитата:
for (var i = 0; i<params.length; i++) {
        if (i==0) this.x = params[0];
        if (i==1) this.y = params[1];
        if (i==2) this.z = params[2];
        if (i==3) this.middle = params[3];
        if (i==4) this.summa = params[4];
    }
Это можно упростить до...
this.x = params[0];
        this.y = params[1];
        this.z = params[2];
        this.middle = params[3];
        this.summa = params[4];
если аргумент конструктора вместо (params) записать так ([x, y, z, middle, summa]), то можно...
this.x = x;
        this.y = y;
        this.z = z;
        this.middle = middle;
        this.summa = summa;
или так...
Object.assign(this, { x, y, z, middle, summa });


Цитата:
this.GeometricMean = function(){this.middle = (this.x+this.y+this.z)/3;}
Вы объявили как собственное свойство каждого экземпляра Numbers, лучше его наследовать.

Цитата:
Numbers.prototype = new Numbers(this.x = 0, this.y = 0, this.z = 0, this.middle = 0, this.summa = 0);
У вас получилась такая цепочка наследования... Numbers → Numbers → Object, а вам нужно Numbers → Object
Numbers.prototype = {};
Ваши this.x = 0 и т. д. создают глобальные переменные, поскольку this в том контексте указывает на глобальный объект.

И зачем вам передавать в конструктор параметры, которые вы всё равно перезапишите?

function Numbers(x, y, z) {
	if(![x,y,z].every(Number.isFinite)) throw new Error("x, y, or z is not a number");
	Object.assign(this, { x, y, z });
}
Numbers.prototype = {
	constructor: Numbers,
	get mean() {
		return this.sum / 3;
	},

	get sum() {
		return this.x + this.y + this.z;
	}
};

function Numbers2(a, b, c) {
	if(![a,b,c].every(Number.isFinite)) throw new Error("a, b or c is not a number");
	this.__proto__.__proto__.constructor.apply(this, arguments); // super(...arguments);
	Object.assign(this, { a, b, c });
}
Numbers2.prototype = {
	__proto__: Numbers.prototype,
	constructor: Numbers2,

	get product() {
		return this.a * this.b + this.b * this.c;
	}
};

var numbers = new Numbers(12.1, 10.5, 20.0);
var chisla = new Numbers2(7.7, 8.5, 9.2);


Сообщение от ProgYoung
А если я просто переименую this.Product в this.getProduct, это будет считаться частным свойством?
Нет, вы просто поменяете имя свойства!

Последний раз редактировалось Malleys, 06.06.2019 в 13:53.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как переименовать свойство объекта? Маэстро Events/DOM/Window 28 25.10.2012 17:02
Не могу получить свойство объекта FINoM Общие вопросы Javascript 4 04.12.2011 04:46
Свойства объекта, методы и this. Почему свойство вызывается с () ? jsuse Общие вопросы Javascript 2 04.11.2011 20:39
Создание скрипта! Создание диктанта для учеников! Елизавета Работа 10 30.06.2010 21:00
Создание копий объекта - обязателен ли prototype? heh131 Общие вопросы Javascript 12 15.05.2010 12:55