js里面 构造函数 对象 api的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js里面 构造函数 对象 api的区别相关的知识,希望对你有一定的参考价值。

参考技术A <script
type="text/javascript">
function
fun()
alert("good");
var
age
=
1;
this.name
=
'Mr
S.G';
this.method
=
fun2;

function
fun2()
alert("this
is
the
second
method
show");

function
fun1()
var
obj
=
new
fun();
alert(obj.name);
obj.method();
alert(obj.age);

window.onload
=
fun1;
</script>
在fun1()方法中通过var
obj
=
new
fun()创建了一个对象。
fun()
是一个特殊的函数
构造函数,它和普通的函数有什么区别和联系我将在下边谈论。
注意到上边有两种形式定义变量。this.name

var
age
.其实通过this方式创建的变量叫做对象的成员变量,可以在外部通过对象引用。而
var
age
是一个局部变量
(如果放到外层,是一个全局变量)
这个变量不能被对象在外部引用(如obj.age)否则是undefine,可以将它看成是一个对象的私有成员变量。
接下来看看看构造函数的执行过程。首先执行var
obj
=
new
fun()这一步后,记录现场,然后跳到fun()的构造函数中,执行alert("good")跳出对话框。接下来就是创建成员变量了(如java
中在堆中创建内存空间,创建栈)。
好了fun()执行完了,回到fun1(),执行下去。注意一点,alert(obj.age)是undefine.
我现在想知道哪些函数可以new(),哪些不可以new().
<script
type="text/javascript">
function
fun2()
alert("this
is
the
second
method
show");

function
fun1()
var
obj
=
new
fun2();
alert(obj);
alert('if
display
there
no
erro
through
the
call');

window.onload
=
fun1;
</script>
这里
function
fun2()是一个函数,但是它是构造函数吗?
你可以将它当做一个构造函数。这里会发现fun1()中的alert()可以正常执行。这里可以总结为任何函数都可以new,在js中函数就是对象。但是试想一下这里new有意义吗?
fun2()中没有变量,或者都是var
定义的变量,那么在外部引用不了。new它干嘛呢?
,还不如让fun2()作为全局函数执行好了。
这里可以回答本章的要探索的问题了:
任何函数都是构造函数,如果通过new就可以得到一个对象。通过函数不同的上下文调用分下面几种:
(1).
当在一个函数调用之前有new关键字,则上下文为新建的对象;
//任何函数可以new
创建一个对象
(2).
当一个函数使用call或者apply调用时,给定的第一个参数即为上下文;
//构造方法中可以写成员方法。然后通过对象来调用
(3).
否则,如果一个函数作为一个对象的属性(obj.func)或者obj['func'])来调用时,它就把该对象作为上下文来运行;
//上边new
fun2()没意义,直接
fun2()调用,这里在全局上下文运行
(4)如果与上述几条都不符的话,则函数将在全局上下文中运行。

js 里面的 function 与 Function

function 是 js 的标识符

Function 是 js 里面的一个 构造函数

1、new function 与 new Function 的区别

  new 运算符在 js 里面是 创建一个自定义的对象的实例 或者是 一个具有构造函数的本地对象的实例。

    语法:new constructor [ ( [ arguments ] ) ]

  new function() {......} 初始化一个可操作对象,相当于 new function 匿名函数() {......}

  

  new Function(\'参数\', \'函数体\') 是实例化一个函数,相当于 function 函数名() {......}

  

2、立即执行函数 ( function(){...} () ) 和 ( function(){...} )()

// 1、
// 定义一个命名函数 a 并调用,正常运行
function a(){}a()
// 2、
// 2 假设使用匿名函数的方式呢?
function (){}() 
//这种方式会报错:Uncaught SyntaxError: Unexpected token (
// 3、
//按到如上思路测试,寻找 2 报错的原因
function () {}
// 3 会报错,与 2 报错相同:Uncaught SyntaxError: Unexpected token (
// 4、
();
// 4 会报错:Uncaught SyntaxError: Unexpected token )
// 5、
(1);
// 5 不会报错正常运行
// 6、
(function(){});
// 6 不会报错正常运行

可以看出,上述现象报错的原因都是:语法错误。究其原因发现是因为 ()运算符 的优先级高于 函数调用,而 () 运算符的括号内必须有表达式,否则就会有语法错误。

因此可以用 (function(){})() 的形式定义一个自调用的匿名函数

//1、
(1+2)(5+6);
//在进行如上表达式运算的时候,会报错:Uncaught TypeError: 3 is not a function,也就是说如果第一个表达式是一个 function 的话,就会正常运行。
//2、所以在保证整个运算为表达式运算的情况下,第一个子表达式为 function,则得出如下写法
(function(){}());
// 2 正常运行不会报错
// 3、因此可以得出如下写法也都是正确的
!function(){};
+function(){};
-function(){};
~function(){};
......

 

以上是关于js里面 构造函数 对象 api的区别的主要内容,如果未能解决你的问题,请参考以下文章

构造函数和原型

JS----构造函数与原型prototype 区别

cocos2djs ctor init onEnter的区别

JS中构造函数与普通函数的区别及JS构造函数原型和实例的关系

js 里面的 function 与 Function

JS中构造函数、实例、原型对象之间的关系