我可以在JavaScript中find一个函数参数的类名吗?
第一部分
代码:
function initGET(req, pre, cb){ var urlparts = req.url.split('?'); ... }
问题描述:
假设我不知道什么是req / req.url,我想find更多的东西。 我知道有一个名为url的成员。 也许req是该类的实例,也许req是inheritance该类的类的实例。
题:
我可以findreq的类名吗? 因为req是一些类,并inheritance更多的类。 你必须在某个类中定义url成员。
第二部分
问题描述:
有没有在javascript中我可以find这个类,所以我可以继续看代码或文档?
例如,
var http1 = require('http'); func(http1), //is there a function? I could get "http".
题:
有没有function? 我可以得到“http”。
第三方
另一个例子,
问题描述:
var server = http.createServer(function(req, res) { ...} http.createServer([requreListerner]) returns a new web server object.
requestListener是一个被添加到'request'事件的函数。
事件:“请求”
function(request, responce) {}
request是http.IncomingMessage的一个实例,response是http.ServerResponse的一个实例。
码:
var server = http.createServer(function(req, res) { func(req) // is there a function? return http.IncomingMessage func(res) // is there a function? return http.ServerResponse ... });
题:
有没有function? 返回http.IncomingMessage是否有一个函数? 返回http.ServerResponse
这里有几个单独的问题。
什么是课堂?
JavaScript有一个instanceof
操作符,并且某些运行时值在instanceof
右边使用是合理的,所以可以说JavaScript有类。
input名称
JavaScript没有一个标准的types系统 ,所以即使可能有类,也没有内置在语言中的类名 。
你可以定义一个名字作为全局对象的属性名称的虚线path,这样x != null && (typeof x == 'object') && (x instanceof eval(typeName(x))
是真的。这些问题虽然在下面讨论。
名字稳定
为了一个名字是有用的,它需要解决一些问题。 JavaScript不会保证名称的稳定性,JavaScript程序经常违反它。
为了保持名字稳定,你需要
var localMyType = MyType; ... // Program here eval("MyType") === MyType // Still true
除非程序有些奇怪。
事实并非如此。
不能保证从全局对象的任何属性查找path将到达相同的构造函数。 JavaScript程序经常违反这个规定。
名称完整性
从全局对象无法访问构造函数并不罕见。
(function () { var instance; function Typ() {} (function () { var Typ = function () {}; Typ.prototype.x = 1; instance = new Typ; alert(instance instanceof Typ); // true })(); alert(instance instanceof Typ); // false }();
instance
的types不能通过全局对象的任何属性查找path到达,所以任何在JS上分层的命名scheme都不会完整。
将模块封装在封闭信封中,然后将公共接口分配给全局variables的做法使得用作实现细节的任何types都不可用。
@迈克的回答是正确的。 这是一些代码
// make a function (any function in JavaScript is a constructor) function A() {} // Make an instance of A x = new A(); // print x's 'class' console.log(x.constructor.name); // prints "A" // make another function var B = function() {}; // make an instance of B y = new B(); // print y's 'class' y.constructor.name // prints ""
正如你所看到的,取决于class级的制作方式,不能保证你可以find任何名字,因为他们可能没有名字。 你可以使用instanceof
虽然它看到一个对象是一件事还是另一件事
console.log(x instanceof A); // prints "true" console.log(y instanceof A); // prints "false console.log(x instanceof B); // prints "false console.log(y instanceof B); // prints "true
正如@Mike所指出的那样, instanceof
只有当你有一个被传递给new
的函数的引用的时候才会起作用
不幸的是,你假设的这一部分:
因为req是一些类,并inheritance更多的类。 你必须在某个类中定义url成员。
是不正确的。 Javascript没有类,没有理由要求和res
需要成员有类。 req.constructor === Object && res.constructor === Object
是完全合法的。 例如:
var req = { url: getUrlFromEnv() }; var res = { body: function setBody(value) { // Write value to socket } };
在上面的例子中, req
和res
都是Object
实例,但是它们不会从其他类inheritance。 这在JS中很常见。 即使他们的内部[[Prototype]]
属性设置为指向另一个对象,也不能保证该对象是“类”:
var requestProto = { url: getUrlFromEnv() }; var req = Object.create(requestProto);
你最好的select是Object.getPrototypeOf
在inheritance的情况下会做正确的事情,但是在新的匿名对象被构造成符合某种形状的情况下不会对你有所帮助。 (在这种情况下,唯一的办法是读取定义这些对象的源代码,并且可以访问这些对象的调用堆栈中的任何地方,因为所有对象都默认是可变的)。