js的对象,如何实现方法共享,数据分离?

WxmJun 2011-12-05 04:37:08


(function(){
function Person(firstName, lastName, age){
//私有变量:
var _firstName = firstName;
var _lastName = lastName;

//公共变量:
this.age = age;

//方法:
this.getName = function() {
return (firstName + " " + lastName);
};
Person.prototype.sayHello = function() {
return ("我是" + firstName + " " + lastName);
};

var f = function(){
return _firstName;
};
Person.prototype.get = function() {
return f;
};
};

var gs = new Person("Bill", "Gates", 53);
var jb = new Person("Steve", "Jobs", 53);

document.write("<br>getName:");
document.write(gs.getName() + "=" + jb.getName());//结果是正确的,方法分离,所以数据也分离

document.write("<br>sayHello:");
document.write(gs.sayHello() + "=" + jb.sayHello()); //结果有问题,都是“Steve Jobs”了,主要是方法共享引起,但数据只认最后一次,这是与getName()的方法区别

document.write("<br>方法:");
document.write(gs.getName == jb.getName); //这是false
document.write(",");
document.write(gs.sayHello == jb.sayHello); //这是true
})();

...全文
313 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WxmJun 2011-12-08
  • 打赏
  • 举报
回复
看了这么多回得,大概知道答案了.
15楼的方式不错,就是搞得有点复杂了.
cuixiping 2011-12-07
  • 打赏
  • 举报
回复
注释去掉
cuixiping 2011-12-07
  • 打赏
  • 举报
回复
楼主的意思,应该是这样的:
(function(){
function Person(firstName){
var _firstName = firstName; //私有变量:
this.constructor._private.set(this, {_firstName : firstName});
this.getName = function() {
return firstName;
};
};
Person._private = {
N:0, cache : {},
get : function (obj){
for(var id in this.cache){
if(obj==this.cache[id].ins){
return this.cache[id].data;
}
}
},
set : function (obj, data){
this.cache[this.N++] = { ins: obj, data: data };
}
};
Person.prototype.sayHello = function() {
var data = this.constructor._private.get(this);
return ("我是" + data._firstName);
};

var gs = new Person("Bill Gates");
var jb = new Person("Steve Jobs");

document.write("<br>getName : ");
document.write(gs.getName() + " / " + jb.getName());//结果是正确的,方法分离,所以数据也分离

document.write("<br>sayHello : ");
document.write(gs.sayHello() + " / " + jb.sayHello()); //结果有问题,都是“Steve Jobs”了,主要是方法共享引起,但数据只认最后一次,这是与getName()的方法区别

document.write("<br>gs.getName===jb.getName : ");
document.write(gs.getName === jb.getName); //这是false
document.write("<br>gs.sayHello===jb.sayHello : ");
document.write(gs.sayHello === jb.sayHello); //这是true
})();


这样就既访问私有属性,又公用方法。

运行结果:
getName : Bill Gates / Steve Jobs
sayHello : 我是Bill Gates / 我是Steve Jobs
gs.getName===jb.getName : false
gs.sayHello===jb.sayHello : true
hexinping123 2011-12-06
  • 打赏
  • 举报
回复
谢谢七楼的朋友,学习了……贴收藏了
WxmJun 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ifandui 的回复:]

prototype方法中的this指向的是调用这个方法的对象,而这两个对象的getName方法访问的变量又不相同
[/Quote]

看来是无法实现对象属性私有了
Legend1988 2011-12-06
  • 打赏
  • 举报
回复
私有属性肯定是可以有的,但也要提供接口访问,不然私有属性也没有意义,上面getName函数就是接口,具体可以看看关于闭包的内容。[Quote=引用 12 楼 wxmjun 的回复:]

引用 7 楼 ifandui 的回复:

prototype方法中的this指向的是调用这个方法的对象,而这两个对象的getName方法访问的变量又不相同


看来是无法实现对象属性私有了
[/Quote]
Legend1988 2011-12-05
  • 打赏
  • 举报
回复

Person.prototype.sayHello = function() {
return ("我是" + this.getName());
};

楼主把sayHello改成上面这样,然后提到Person构造函数外面定义。
一個程序員 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 wxmjun 的回复:]
JScript code


(function(){
function Person(firstName, lastName, age){
//私有变量:
var _firstName = firstName;
var _lastName = lastName;

//公共变量:
this.ag……
[/Quote]

明白你的意思

但是据我所知,公共方法(从原型链上获得的方法)内部是不能访问私有属性(即:var声明的内容),

如果强行访问私有属性,则原型链上的方法会形成了闭包方法,而构造出来的所有对象均使用这个闭包方法,

大家都访问同一个var属性,那就杯具了,既没起到公共方法私有属性的作用,反而留下个bug。

凡事涉及到访问私有属性的方法,都必须是独立的方法(非原型链上的方法)。
默默不得鱼 2011-12-05
  • 打赏
  • 举报
回复
prototype方法中的this指向的是调用这个方法的对象,而这两个对象的getName方法访问的变量又不相同
WxmJun 2011-12-05
  • 打赏
  • 举报
回复
是不是可以这样理解:

把有的闭包变量,必须通过闭包方法引用? 不能使用prototype方法引用?

prototype方法要使用闭包变量,必须通过this.get方法获取,不能直接使用?
默默不得鱼 2011-12-05
  • 打赏
  • 举报
回复
Person.prototype.sayHello = function() {
return ("我是" + this.getName())
};
默默不得鱼 2011-12-05
  • 打赏
  • 举报
回复
Person.prototype.sayHello = function() {
return function() {
return ("我是" + this.getName())
};
}();
WxmJun 2011-12-05
  • 打赏
  • 举报
回复
楼上的
document.write(gs.sayHello == jb.sayHello);
false哦,我想要是true


//上面方法的代码可能变量用错了,可能有误导:
this.getName = function() {
return (_firstName + " " + _lastName + ":" + this.age);
};
Person.prototype.sayHello = function() {
return ("我是" + _firstName + " " + _lastName + ":" + this.age);
};
默默不得鱼 2011-12-05
  • 打赏
  • 举报
回复
this.sayHello = function(a,b) {
return function() {
return ("我是" + a + " " + b)
};
}(firstName,lastName);
WxmJun 2011-12-05
  • 打赏
  • 举报
回复
补充一下,不能把这些变量公开 _firstName ,_lastName ,它们必须是私有的

87,990

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧