【发布时间】:2013-12-06 14:49:32
【问题描述】:
考虑以下一点点 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。)
对比(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
})();
(这允许我正在寻找的标准属性样式(空参数返回一个值,传递一个参数将设置该值
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?
}
}
我需要能够基于原型多态地执行一些操作。最后一个代码 sn-p 是最容易阅读的,但它不提供我正在寻找的 get/set 简洁性。第一个代码 sn-p 可以很好地让我 Object.create 但它有 Object 作为原型。如果我想要像obj.test() 这样的get/set 方法来get 和obj.test(100) 来设置,我怎样才能实现向原型添加方法而不是在构造函数本身内部?
【问题讨论】:
-
您的第二个示例不适用于多个实例
-
为什么要在原型上使用 setter 和 getter?在构造函数中创建它们很好。
-
@Bergi 将它们放在原型上没有真正的优势吗?我的印象是这是最佳实践?还是仅用于方法而不是属性?
-
好吧,特定于实例的属性(例如想要使用特定于实例的变量范围来实现私有性的 getter/setter 方法)需要进入构造函数。使用原型只是可以在实例之间共享的属性(值和方法)的最佳实践。
-
@Bergi 很高兴知道,因为我觉得我不得不尝试在原型上硬设置 get/set。我只是不想偷懒,但这让事情变得容易了 100 倍。 :)
标签: javascript jquery constructor