考虑下面的一点JavaScript :(我不担心向后兼容性,我不想使用很快就会被弃用的任何内容。)
var Person = (function () {
var _age,
_name;
function age(num) {
if (!num) {
return _age;
}
else {
_age = num;
}
}
function name(val) {
if (!val) {
return _age;
}
else {
_name = val;
}
}
return {
age: age,
name: name
}
})();
console.log(Person.age()); //undefined
Person.age(100);
console.log(Person.age()); //100
(不知道这会有多大用处,如果我想做多态的话,这里的原型仍然是Object。)
VS。 (iffy中的构造函数,闭包允许名称和val接受_name和_val
var Person = (function () {
var _age,
_name;
function Person(options) {
_age = options.age;
_name = options.name;
}
Person.prototype.age = function (val) {
if (!val) {
return _age;
}
else {
_age = val;
}
}
var test = new Person({ age: 100, name: 'jon' });
console.log(test.age());//100
//if I want to do with Person objects outside of this script I should
//return something
})();
(这允许我正在寻找的标准属性样式(null参数返回一个值,传递参数将设置该值
function Person(age, name) {
//i don't want to add get and set methods to each instance of Person
}
Person.prototype.age = function (num) {
if (!num) {
//what to return if nothing is passed to age?
return //what?
}
else {
//x = num
//what would x be?
}
}
我需要能够基于原型以多态方式执行某些操作。最后一个代码片段是最容易阅读的,但它不提供我正在寻找的get / set succintness。第一个代码片段会让我Object.create
足够好,但它有Object作为原型。如果我想要获取/ {设置obj.test()
等方法并设置obj.test(100)
,我怎样才能在原型中添加方法而不是在构造函数本身内?
答案 0 :(得分:3)
与你的问题没有直接关系,但是既然你在标题上提到了“getter and setters”,我想我可以用ES5 getter和setter补充答案:
function Person(age, name) {
this.name = name;
this.age = age;
};
Object.defineProperty(Person.prototype, "age", {
get: function() {
return this._age;
},
// Added a few things to demonstrate additional logic on the setter
set: function(num) {
num = parseInt(num, 10);
if(num > 0) {
this._age = num;
}
}
});
然后,它可以透明地使用,就好像它是一个普通的属性:
var person = new Person(20, "Jane Doe");
person.age; // => 20
person.age = 15;
person.age; // => 15
person.age = "20";
person.age; // => 20 (number)
person.age = -2;
person.age; // => 20
适用于任何最近的浏览器,IE> = 9。
答案 1 :(得分:2)
您必须将其作为公共属性存储在您的实例上。常用的惯例是使用_
表示私有成员。
以下是您的实施方案。
function Person(age, name) {
this.age(age);
}
Person.prototype.age = function (num) {
if (!num) {
return this._age;
}
else {
this._age = num;
}
}