m.lom599.com_手机版乐白家网址_乐百家手机首页登录

类和命名空间的模拟代码,Function进行语法检查

作者: 手机版乐白家网址  发布:2019-09-06

使用new Function( ) 来进行语法检查
eval( ) 方法是不能乱用的,在不适当的时候使用eval( ) 方法可能导致整个程序都会出问题的;
而new Function( ) 就没这么大问题。虽然new Function( ) 在任何情况下,构造的函数都是在全局作用域下直接工作的,但只作语法检查的话,并不会因为作用域问题而产生意外结果,只要你不直接调用通过它构造的新函数。

constructor是什么

先上一段最简单的:

在eval( ) 接受的参数前面增加“0,”
其实这是由于IE中存在一个bug。出于某种原因,如果你在IE 中想通过调用eval( ) 来动态地构造一个函数。
例如:
eval('(function(){ /* code here */ })');
在IE 中得到的返回将是undefined,而其它浏览器则会正确地返回这个新构造的函数的引用。
最简单有效的解决办法是:在前边加上“0,”,这样就能在所有主流浏览器中兼容。
例如:
eval('0,function(){ /* code here */ }');
注:在IE9 的Chakra 引擎中,这个问题已经解决。

简单的理解,constructor指的就是对象的构造函数。请看如下示例:

复制代码 代码如下:

使用数组对象的concat方法来产生新数组
把单个对象参数转化为只包含一个元素的数组再来处理,可以使用“[ ].concat(o)”的形式。
例如:

复制代码 代码如下:

// 以下几行代码展示了命名空间、类、以及函数的模拟定义和使用:
NameSpace = {};
NameSpace.Class = function(){
this.Method = function(info){alert(info);}
};
new NameSpace.Class().Method("Hello world");

复制代码 代码如下:

function Foo(){};
var foo = new Foo();
alert(foo.constructor);//Foo
alert(Foo.constructor);//Function
alert(Object.constructor);//Function
alert(Function.constructor);//Function

再来一些可见到的,各种情况的代码
1.类的模拟

var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = arr1.concat(arr2);
alert(arr3.length);

对于foo.constructor为Foo,我想应该很好理解,因为foo的构造函数为Foo。对于Foo、Object、Function的构造函数为Function,我想也没什么好争议的。(因为Foo,Object,Function都是函数对象,又因为所有的函数对象都是Function这个函数对象构造出来,所以它们的constructor为Function,详细请参考《js_函数对象》)

复制代码 代码如下:

另一种方式是:if (!(o instanceof Array)) o = [o];
// 和ECMAScript 5 中的isArray 相比不够严谨。

Prototype与Constructor的关系

// 类定义
function Class(info){
// 私有成员
var privateData = "private data";
var privateMethod = function(){writeline("private");};
function privateMethod2(info){writeline("private");}
// 公有成员(使用this)
this.Data = "public data";
this.Method = function(){writeline(info);};
};
// 类的静态成员
Class.StaticData = "static data";
Class.StaticMethod = function(info){writeline(info);};

网友回复:
1.eval 确实不能乱用;
2.在IE eval 的时候,我的解决方法是在执行函数体内return ;
3.Array.prototype.concat.apply([1,2,3],[4,5,6]);

复制代码 代码如下:

2.命名空间的模拟

Function( ) 来进行语法检查 eval( ) 方法是不能乱用的,在不适当的时候使用eval( ) 方法可能导致整个程序都会出问题的; 而new Function...

function Dog(){}
alert(Dog === Dog.prototype.constructor);//true

复制代码 代码如下:

在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用,如图:
图片 1
constructor属性来自何方
我们来看一下Function构造String的构造过程:
图片 2
注:Function构造任何函数对象的过程都是一样的,所以说不管是String,Boolean,Number等内置对象,还是用户自定义对象,其构造过程都和上图一样。这里String只是一个代表而矣!
图中可以看出constructor是Function在创建函数对象时产生的,也正如'prototype与constructor的关系'中讲的那样,constructor是函数对象prototype链中的一个属性。即String=== String.prototype.constructor。

function NameSpace(){}
或者
NameSpace = {};
或者
NameSpace = new Object();

我还想用一段代码来证明一下,理论是正确的:

3.目标:创建类实例,并调用实例方法

本文由m.lom599.com发布于手机版乐白家网址,转载请注明出处:类和命名空间的模拟代码,Function进行语法检查

关键词: m.lom599.com