如果我宣布这样一个类:
var Foo = function() {};
并像这样添加属性:
Foo.prototype.bar = "";
为什么我不能像这样访问该属性:
Foo.prototype.setBar = function( value ) {
this.bar = value;
}
在我的代码中,我Foo.prototype.bar
的范围内没有Foo.prototype.SetBar
。 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
未定义。现在从我的理解和你们所说的话来看,这不应该是。
更新
这是我的代码http://jsfiddle.net/bZrtn/的JS小提琴。我有2个类JSocketServer和JSocket,它们被底部的APP使用。
答案 0 :(得分:4)
是的,您可以但仅在检索值时。设置该值将创建实例propety。如果指定实例属性,则将返回它而不是原型值。这意味着您可以:
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来展示原始问题。
答案 1 :(得分:2)
// Set up static class properties JSocketServer.prototype.socketPool = {}; JSocketServer.prototype.socketMap = {}; // Inherit from EventEmitter mutil.inherits(JSocketServer, mevents.EventEmitter);
和
// Set static class properties JSocket.prototype.moduleID = ""; JSocket.prototype.dataArray = []; JSocket.prototype.dataString = ""; // Inherit from EventEmitter mutil.inherits(JSocket, mevents.EventEmitter);
是使您的代码无效的部分。 utils.inherit
将覆盖 .prototype
JSocketServer
{和JSocket
一个新的空对象继承自EventEmitter
。
仅在继承后才能对原型对象进行分配!
// Inherit from EventEmitter first
mutil.inherits(JSocketServer, mevents.EventEmitter);
// then set up static class properties
JSocketServer.prototype.socketPool = {};
JSocketServer.prototype.socketMap = {};
…
// Inherit from EventEmitter first
mutil.inherits(JSocket, mevents.EventEmitter);
// then set static class properties
JSocket.prototype.moduleID = "";
JSocket.prototype.dataArray = [];
JSocket.prototype.dataString = "";
顺便说一下,对于静态类属性,您可能(更好?)将它们直接放在构造函数上而不是原型上,即
。JSocketServer.socketPool = {};
JSocketServer.socketMap = {};
然后总是使用这个完全限定的名称显式引用它们,而不是作为(继承的)实例属性。