Я пытаюсь создать свойство только для чтения в функции конструктора с Javascript. Я ремикс the syntax I've found on MDN, но это не работает:Создать свойство только для чтения (получить) в функции конструктора
function Person(data) {
var self = this;
self.firstName = data.firstName || "John";
self.lastName = data.lastName || "Doe";
get fullName() { return self.firstName + " " + self.lastName; }
}
var mike = new Person({ firstName: "Mike", lastName: "Michaelson" });
document.write(mike.fullName);
Это сгенерирует исключение:
Uncaught SyntaxError: Unexpected identifier
Я пробовал другие варианты, в том числе:
{ get fullName() { return self.firstName + " " + self.lastName; } }
И:
get this.fullName() { return self.firstName + " " + self.lastName; }
И:
get self.fullName() { return self.firstName + " " + self.lastName; }
Но ни один из этих вариантов не работает.
Это один делает работы:
function Person(data) {
var self = this;
self.firstName = data.firstName || "John";
self.lastName = data.lastName || "Doe";
Object.defineProperty(self, "fullName", { get: function() { return self.firstName + " " + self.lastName; } });
}
var mike = new Person({ firstName: "Mike", lastName: "Michaelson" });
document.write(mike.fullName);
Но, очевидно, таким образом, с defineProperty
чувствует себя неуклюжей.
Каков правильный синтаксис для определения get
-только свойств внутри функций конструктора?
Вы можете либо поместить его в 'prototype' (' object.prototype = {get x() {return this._x;}} '- но вы можете сделать это только один раз при объявлении полного прототипа) или использовать' defineProperty'. Если вы создаете свойство только для чтения, вы должны фактически использовать 'defineProperty', чтобы сделать его невозможным для записи. Это единственные действительные синтаксические способы сделать это. – somethinghere
@ Jeroen вы ищете доступ для чтения/записи для имени/фамилии, но доступ только для чтения к 'fullName'? Если это так, пожалуйста, перечитайте мой ответ, поскольку я обновил его для размещения в таком случае. – Droogans
@Droogans Спасибо за ваши идеи и мысли. Вы правильно поняли о доступе к чтению/записи, хотя я уже смог экстраполировать ваш первоначальный ответ на эти случаи.Я одобрил ваш ответ, это полезно, но это не совсем * ответ на мой вопрос, так как ваша функция «Личность»/больше не может использоваться как функция * constructor *, поскольку она нарушает наследование. - Угадайте, что я просто испорчен синтаксисом свойств C# ... – Jeroen