如何在javascript中检测本机浏览器/引擎对象

时间:2013-12-01 15:35:07

标签: javascript browser native javascript-engine

如果给定的变量名已经由javascript引擎或浏览器定义,我需要一个函数返回true。

例如

isNative('window') //true;
isNative('Math') //true;
isNative('myVar') //false
isNative('navigator') //true
isNative('document') //true

5 个答案:

答案 0 :(得分:3)

好的,我找到了解决方案。

function isNative(variableName) {
    if (window['__emptyIframeRef__'] === undefined) {            
        window['__emptyIframeRef__'] = document.createElement('iframe');
        window['__emptyIframeRef__'].setAttribute('style', 'display:none');
        document.getElementsByTagName('body')[0].appendChild(window['__emptyIframeRef__']);
    }
    return window['__emptyIframeRef__'].contentWindow[variableName] !== undefined;
}

答案 1 :(得分:1)

我认为这不是你想要的。第一件事;全局变量很糟糕。所以你应该拥有自己的命名空间,你拥有所有自己的逻辑/模块/功能,如;

var danial={
    module1:{
        get:function(bla){...}
    },
    module2:(function(){
        ....
    }());
}

现在,本机对象/函数与自定义对象/函数之间没有区别。他们都在原型链的顶部有对象原型,没有办法区分。但是你可以检查的是,如果你的对象具有属性本身或者它是在原型链上“继承”的,例如toString将始终存在但不属于你的对象(除非你已经定义并覆盖它)。您可以使用以下代码检查

for (var prop in obj) {
    if( obj.hasOwnProperty( prop ) ) {
        console.log("own property", prop, obj[prop]);
    } 
}

答案 2 :(得分:1)

这是可能的,但我不知道你能用它做什么好事,而且效率也不高。

您需要做的就是在第一时间准备一个变量来克隆窗口。

// Borrowed from Coffeescript
// Similar functionality as underscore.js extend()
__extends = function(child, parent) { 
              for (var key in parent) { 
                if (__hasProp.call(parent, key)) child[key] = parent[key]; 
              } 
              function ctor() { this.constructor = child; } 
              ctor.prototype = parent.prototype; child.prototype = new ctor();
              child.__super__ = parent.prototype; return child; 
            };

var foo;
foo = __extends({}, window);

//Usage
foo.hasOwnProperty('console')
// true
window.hasOwnProperty('console')
// true

var bar = 'bar'
foo.hasOwnProperty('bar')
// false
window.hasOwnProperty('bar')
// true

答案 3 :(得分:0)

http://jsfiddle.net/7h3su/

上查看
function isNative(variableName){
    return window[variableName]!=undefined;
}
alert(isNative('window')) //true;
alert(isNative('Math')) //true;
alert(isNative('myVar')) //false
alert(isNative('navigator')) //true
alert(isNative('document')) //true

答案 4 :(得分:-1)

'document'对象不是原生的。

function isNative(variableName){
    return [Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError].some(function(element){return window[variableName]===element});
}
myVar = 10;
alert(isNative('Object')) //true;
alert(isNative('String')) //true;
alert(isNative('myVar')) //false;
alert(isNative('document')) //false;

检查它是否可以帮助您:http://jsfiddle.net/na65y/2/