woo*_*gie 2 javascript jquery constructor
考虑以下 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
Run Code Online (Sandbox Code Playgroud)
(不确定这会有多大用处,如果我想做一些多态的事情,这里的原型仍然是 Object。)
vs. (iffy 中的构造函数,闭包允许 name 和 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
})();
Run Code Online (Sandbox Code Playgroud)
(这允许我正在寻找的标准属性样式(空参数返回一个值并传递一个参数将设置该值
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?
}
}
Run Code Online (Sandbox Code Playgroud)
我需要能够基于原型以多态方式执行一些操作。最后一段代码最容易阅读,但它没有提供我正在寻找的 get/set 简洁性。第一个代码片段会让我感觉Object.create
很好,但它以 Object 作为原型。如果我想要像obj.test()
get 和obj.test(100)
to set这样的 get/set 方法,我怎样才能在原型中而不是在构造函数内部实现这种添加方法?
与您的问题没有直接关系,但由于您在标题中提到了“getter 和 setter”,我想我可以用 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;
}
}
});
Run Code Online (Sandbox Code Playgroud)
然后,就可以透明的使用了,就好像它是一个普通的属性一样:
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
Run Code Online (Sandbox Code Playgroud)
适用于任何最近的浏览器,并且 IE >= 9。
归档时间: |
|
查看次数: |
1010 次 |
最近记录: |