gpt4 book ai didi

私有(private)属性的 Javascript 动态 getter/setter

转载 作者:数据小太阳 更新时间:2023-10-29 05:48:48 24 4
gpt4 key购买 nike

我想动态地创建 getter/setter 方法来检索私有(private)属性。

这是我做的。

首先,我制作了这个类:

function winClass (posX, posY, w, h) {
var x = posX || 0;
var y = posY || 0;
var width = w || 0;
var height = h || 0;
}

然后我用getter/setter方法扩展了winClass,如下:

winClass.prototype.getX = function () {
return x;
}

winClass.prototype.setX = function (val) {
x = val;
}

然后我测试了:

var win1 = new winClass (10, 10, 100, 100);
document.write (win1.getX ());

但是当我尝试设置“getX”方法时出现以下错误:“x is not defined”。这是有道理的,因为“x”不在 winClass 范围内,但因此我不知道如何为私有(private)变量动态设置 getter/setter 方法。

有什么想法吗?

最佳答案

getter/setter 必须在可以看到私有(private)变量的范围内,并且唯一可以看到这些变量的范围是构造函数的内部。这就是为什么这些变量实际上是私有(private)的。因此,要为它们制作 setter/getter,您必须将函数放在可以看到它们的范围内。这将起作用:

function winClass (posX, posY, w, h) {
var x = posX || 0;
var y = posY || 0;
var width = w || 0;
var height = h || 0;

this.getX = function() {return(x);}
this.setX = function(newX) {x = newX;}
}

var win1 = new winClass (10, 10, 100, 100);
alert(win1.getX()); // alerts 10

你可以在这里看到它的工作:http://jsfiddle.net/jfriend00/hYps2/ .

如果你想要一个通用的私有(private) getter/setter,你可以这样做:

function winClass (posX, posY, w, h) {
var privates = {};
privates.x = posX || 0;
privates.y = posY || 0;
privates.width = w || 0;
privates.height = h || 0;

this.get = function(item) {return(privates[item]);}
this.set = function(item, val) {privates[item] = val;}
}

var win2 = new winClass(10,10,100,100);
alert(win2.get("x")); // alerts 10

而且,如果你想破解这些对我来说毫无意义的私有(private)性质(那么你不妨将它们设为标准实例变量),你可以这样做:

function winClass (posX, posY, w, h) {
var privates = {};
privates.x = posX || 0;
privates.y = posY || 0;
privates.width = w || 0;
privates.height = h || 0;

this.getPrivates = function() {return(privates);}
}

winClass.prototype.getX = function() {
return(this.getPrivates().x);
}

winClass.prototype.setX = function(newX) {
this.getPrivates().x = newX;
}

此处示例:http://jsfiddle.net/jfriend00/EKHFh/ .

当然,这破坏了变量的私有(private)性质,所以这样做实际上没有任何意义,因为使它们成为常规实例变量会更容易并且具有相同的访问控制。

并且,为了完整起见,这里是普通的实例变量方法,它允许您自由地将访问器方法添加到原型(prototype),但变量不是私有(private)的。

function winClass (posX, posY, w, h) {
this.x = posX || 0;
this.y = posY || 0;
this.width = w || 0;
this.height = h || 0;
}

winClass.prototype.getX = function() {
return(this.x);
}

winClass.prototype.setX = function(newX) {
this.x = newX;
}

关于私有(private)属性的 Javascript 动态 getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com