如果我声明一个这样的类:
var Foo = function() {};
并向其添加属性,如下所示:
Foo.prototype.bar = "";
为什么我无法像这样访问该属性:
Foo.prototype.setBar = function( value ) {
this.bar = value;
}
在我的代码中,Foo.prototype.SetBar
范围内没有 Foo.prototype.bar
。 this.bar 显示未定义。
更新
好吧,也许我应该更具体一点,因为由于某种原因我的代码没有运行。
var JSocketServer = function( options, callback ) {
if( typeof(options) != "object" ) {
callback("Invalid object passed for options");
return;
}
if( typeof(options.port) != "number" ) {
callback("Must specify a port number in options");
return;
}
// Hook up Event Emitter Functionality
mevents.EventEmitter.call(this);
this.initServer( options, callback );
};
// Set up static class properties
JSocketServer.prototype.socketPool = {};
JSocketServer.prototype.socketMap = {};
// Inherit from EventEmitter
mutil.inherits(JSocketServer, mevents.EventEmitter);
JSocketServer.prototype.initServer = function( options, callback ) {
// Hook up raw tcp server
var jserver = this;
var server = mnet.createServer( function( socket ) {
jserver.handleSocket( socket, callback );
});
server.listen(options.port, function() {
console.log("Socket Server is bound");
})
this.serverListener( server )
}
JSocketServer.prototype.handleSocket = function( socket, callback ) {
var jsocketServer = this;
var jsocket = new mjsocket(socket);
console.log("Socket: "+jsocket.socketID+" connected");
this.socketPool[jsocket.socketID] = jsocket;
jsocket.on("data", function( data ) {
// Add socket id to socket map
jsocketServer.socketMap[jsocket.moduleID] = jsocket.socketID;
});
jsocket.on("close", function(err) {
jsocketServer.removeSocket(jsocket.socketID);
});
// Callback with JSocket
callback( undefined, jsocket );
}
现在在 JSocketServer.prototype.handleSocket
中,我尝试将键和值分配给 this.socketPool
,它说 this.socketPool
未定义。现在根据我的理解和你们所说的,这不应该是。
更新
这是我的代码的 JS Fiddle http://jsfiddle.net/bZrtn/ 。我有 2 个类 JSocketServer 和 JSocket,它们正在由底部的 APP 使用。
最佳答案
是的,您可以,但仅限于检索值时。设置该值将创建一个实例属性。如果您指定实例属性,则将返回该属性而不是原型(prototype)值。这意味着您可以:
Foo.prototype.radius = 5;
Foo.prototype.diameter = function() {
return this.radius * 2;
};
var circle = new Foo();
console.log(circle.diameter()); // prints 10
circle.radius = 10;
console.log(circle.diameter()); // prints 20 just for this instance
这是一个图表,说明了来自以下站点 http://docstore.mik.ua/orelly/webprog/jscript/ch08_04.htm 的基于圆圈的示例。
JSFiddle演示原始问题。
关于javascript - 您可以在原型(prototype)函数中访问原型(prototype)属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249721/