如何创建 Prototype 函数可访问的私有变量?
我试图更深入地了解原型继承和类创建(我知道,还有其他方法,但出于此目的,我试图掌握原型。)我的问题是:使用以下代码示例是有一种方法可以在 Tree
和 Fruit
内部创建私有变量,这些变量不会随函数返回,但仍然可以被原型函数 genus
访问> 和批量
?
var Tree = function ( name, size ) {
this.name = name;
this.size = size;
};
Tree.prototype.genus = function(){
return ((typeof this.name !== 'undefined') ? this.name : 'Hybridicus Maximus');
};
Tree.prototype.bulk = function(){
return ((typeof this.size !== 'undefined') ? this.size : '8') + ' ft';
};
var Fruit = function( name, size ) {
this.name = name;
this.size = size;
};
Fruit.prototype = new Tree();
// Fruit.prototype = Tree.prototype; -- I know this can be used, too.
Fruit.prototype.bulk = function(){
return ((typeof this.size !== 'undefined') ? Math.floor(this.size / 2) : '4') + ' lbs';
};
var pine = new Tree('Pine', 9);
var apple = new Fruit('Apple', 6);
console.log(pine.genus(), pine.bulk()); // Outputs: "Pine 9 ft"
console.log(apple.genus(), apple.bulk()); // Outputs: "Apple 3 lbs"
编辑:我试图用可以在原型函数中访问的私有变量替换 this.name
和 this.size
。抱歉,不清楚!
I'm trying to get a deeper hold on prototypal inheritance and class creation (I know, there are other ways, but for the purpose of this I'm trying to grasp prototypes.) My question is: Using the following code example, is there a way to create private variables inside of Tree
and Fruit
that will not be returned with the function, but is still accessible to the prototype functions genus
and bulk
?
var Tree = function ( name, size ) {
this.name = name;
this.size = size;
};
Tree.prototype.genus = function(){
return ((typeof this.name !== 'undefined') ? this.name : 'Hybridicus Maximus');
};
Tree.prototype.bulk = function(){
return ((typeof this.size !== 'undefined') ? this.size : '8') + ' ft';
};
var Fruit = function( name, size ) {
this.name = name;
this.size = size;
};
Fruit.prototype = new Tree();
// Fruit.prototype = Tree.prototype; -- I know this can be used, too.
Fruit.prototype.bulk = function(){
return ((typeof this.size !== 'undefined') ? Math.floor(this.size / 2) : '4') + ' lbs';
};
var pine = new Tree('Pine', 9);
var apple = new Fruit('Apple', 6);
console.log(pine.genus(), pine.bulk()); // Outputs: "Pine 9 ft"
console.log(apple.genus(), apple.bulk()); // Outputs: "Apple 3 lbs"
EDIT: I'm trying to replace this.name
and this.size
with private variables that can be accessed in the prototype functions. Sorry for the lack of clarity!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
是的。您可以这样做:
现在,这将提供一个这些函数可以看到的私有变量,但它将是一个私有“类”变量 - 换句话说,所有实例都将共享相同的变量。如果您希望每个实例都有一个私有变量,则必须在构造函数(或“init”方法或其他方法)中执行此操作,这意味着共享这些私有变量的方法也必须在那里创建。 (当然,您可以在原型上放置一个函数,该函数将在构造时创建实例方法。)
编辑 - 您可以做的一件事是使用这样的技术来构建一个类似于 jQuery 的“.data()”的机制,这样您就有一个类变量来充当保存每个实例值的位置。这会有点笨拙,但它是可行的。
Yes. You can do this:
Now, that'll provide a private variable that those functions can see, but it'll be a private "class" variable - all instances will share the same variable, in other words. If you want a private variable per instance, you have to do that in the constructor (or "init" method, or whatever), meaning the methods that share those privates would also have to be created there. (You could of course put a function on the prototype that would create the instance methods at construction time.)
edit — One thing you could do is use a technique like this to build a mechanism like jQuery's ".data()", so that you'd have a class variable that acts as a place to keep per-instance values. It'd be kind-of clunky, but it'd be workable.
这是我在关于 类、私人成员和JavaScript 中的原型继承。基本上,您想要创建一个对每个对象都唯一的私有变量访问器函数,然后让这些原型方法调用该私有访问器函数,为其提供仅在闭包中可用的密钥:
您会注意到最后一行显示私有变量无法在闭包外部访问,因此无法由第三方代码检索,除非通过访问器函数提供。
This is what I wrote about in a blog post about Classes, Private Members, & Prototypal Inheritance in JavaScript. Basically you want to create a private variable accessor function unique to every object and then have those prototype methods call that private accessor function, supplying it with the key that is only available within the closure:
You will notice that the last line shows that private variables are not accessible outside of the closure and thusly can't be retrieved by third-party code unless made available by an accessor function.
这样就可以很容易地实现。
显然,关键点是利用闭包创建一个私有变量的访问路径,然后在要创建的对象之间共享这个访问点。利用接入点作为为自然共享而创建的对象的原型是理想的情况。因此,可以通过利用工厂模式和
Object.create()
来实现相同的功能,如下所示;JavaScript 原型结构是黄金..!
It can be easily achieved like this
Obviously the key point is to create an access route to a private variable by utilizing a closure and then sharing this access point among the objects to be created. Utilizing the access point as a prototype of the objects to be created for natural sharing is the ideal case. Accordingly the same functionality can be achieved by utilizing the factory pattern and
Object.create()
as follows;JavaScript prototypical structure is golden..!
我是根据您的问题标题而不是您提供的内容编写的。我在这里也有同样的问题。
基本上,
Tree
函数为其内部的构造函数Tre
提供了一个闭包。您可以使用位于Tre
外部但位于匿名函数Tree
内部的私有名称,而不是使用最深的privatename
。i made up this based on your title of question, not the content you gave. i had the same question here.
basically the
Tree
function provided a closure for the constructorTre
inside of it. Instead of using the deepestprivatename
, you can use the one that's outside ofTre
but inside of the anonymous functionTree
.