您的当前位置:首页正文

xWin之JS版_javascript技巧

2023-12-01 来源:布克知识网

目前代码应该没什么bug了,兼容IE6.0 & FF 1.5, 通过xHTML 的Transitional验证和 CSS 验证。 为了能通过验证,只好再次改变使用的方式,改为用DIV实现,方法: 代码如下: width="200" top="270" left="140" title="我就是传说中那个超长的窗口标题" content [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

小编还为您整理了以下内容,可能对您也有帮助:

Javascript调用函数方法的几种方式介绍_javascript技巧


javascript语法灵活,同一个功能有五六种实现方式并不罕见,然后再加上有些*的原型继承和异步特性,就更让人一头雾水了。我经常搞不清楚call,apply之间的区别,今天就记录一下,以免再忘了。

在javascript中,方法可以通过以下几种方式执行:

1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。

2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法中的入参一一对应。

3.func.bind(sth)(),mozilla手册中提到bind是在ECMA-262 5th Edition中新增的一个特性,这里单独列出来作为一种调用方式是因为它弥补了直接调用中不能绑定作用域的缺陷。

4.func.call(),这是第二种调用方式,每个方法的原型中都定义了call方法,用来执行当前方法。

5.func.apply(),call的双胞胎兄弟。

func()

这是最常见的调用方式,在任何语言中随处可见。func(x, y)可以传入不同的参数。在某些语言,例如php,java中,这种调用足以解决一切问题。但是javascript是一门函数式语言,闭包的概念和一个奇怪的关键词this决定了这种调用方式的不足。this应该可以解释为当前代码段的作用域,会随着代码执行到不同的片段而改变,但是某些情况下我们不希望这个this被改变,例如绑定在某些dom上的事件,我们肯定不希望他们被调用的时候this被转移到了window对象上,但有时候确实如此,再比如下面的代码。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func(x);
};
a.onclick();


可以把a想象成页面中的一个链接,由于我们只是想将定义好的方法绑定到onclick事件上,而不是立刻调用它,而且这个方法拥有一个参数,所以我们需要用一个匿名方法将他包起来传递给a的onclick事件。这样就有了一个问题,func中的this变成了全局对象window,显然我们并不希望如此。这个时候,使用func()这种直接调用的方式就不行了,于是我们需要将func外的this绑定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常简单,返回一个绑定了this对象的相同方法。上面的代码修改一行就可以实现绑定this在a对象上目的。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func.bind(this)(x); // bind here
};
a.onclick();


这样,onclick事件的this就不会像无头苍蝇一样到处乱跑啦。

call & apply

call和apply要放在一起讲,因为他们实在太像了。他们都支持多参数,而且第一个参数都是即将绑定的this对象,第二个参数则是他们的区别所在,call使用独立的参数作为调用方法的入参,apply使用一个数组作为入参。有的时候我们并不是不想改变this对象,而是想人为的将他绑定到别的对象上,这个时候call和apply是很好用的。(并不是说不能用bind,不过貌似bind出现的比较晚,可能浏览器兼容性不好)。举个栗子:
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func();
}
console.log(a.x);
console.log(b.x);


上面的a和b对象中都有x,我们希望func能针对性的修改对应的x,但是直接调用只可能修改func作用域中的x,也就是a.x。修改一下代码,就可以实现修改b.x目的
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func.call(b); // bind this to b
}
console.log(a.x);
console.log(b.x);


这个栗子举得不好,有点牵强附会,而且这是一种很容易让人迷惑的代码风格,有适用的场景,但不是处处都可用。

Javascript调用函数方法的几种方式介绍_javascript技巧


javascript语法灵活,同一个功能有五六种实现方式并不罕见,然后再加上有些*的原型继承和异步特性,就更让人一头雾水了。我经常搞不清楚call,apply之间的区别,今天就记录一下,以免再忘了。

在javascript中,方法可以通过以下几种方式执行:

1.func(),这是最直接最常见的调用方式,也符合一般人的思维逻辑,但是在某些情况下有一些不足,下面会解释。

2.(function(arg){})(window),匿名方法调用,在构造命名空间时比较有用,后面的括号中的参数与匿名方法中的入参一一对应。

3.func.bind(sth)(),mozilla手册中提到bind是在ECMA-262 5th Edition中新增的一个特性,这里单独列出来作为一种调用方式是因为它弥补了直接调用中不能绑定作用域的缺陷。

4.func.call(),这是第二种调用方式,每个方法的原型中都定义了call方法,用来执行当前方法。

5.func.apply(),call的双胞胎兄弟。

func()

这是最常见的调用方式,在任何语言中随处可见。func(x, y)可以传入不同的参数。在某些语言,例如php,java中,这种调用足以解决一切问题。但是javascript是一门函数式语言,闭包的概念和一个奇怪的关键词this决定了这种调用方式的不足。this应该可以解释为当前代码段的作用域,会随着代码执行到不同的片段而改变,但是某些情况下我们不希望这个this被改变,例如绑定在某些dom上的事件,我们肯定不希望他们被调用的时候this被转移到了window对象上,但有时候确实如此,再比如下面的代码。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func(x);
};
a.onclick();


可以把a想象成页面中的一个链接,由于我们只是想将定义好的方法绑定到onclick事件上,而不是立刻调用它,而且这个方法拥有一个参数,所以我们需要用一个匿名方法将他包起来传递给a的onclick事件。这样就有了一个问题,func中的this变成了全局对象window,显然我们并不希望如此。这个时候,使用func()这种直接调用的方式就不行了,于是我们需要将func外的this绑定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常简单,返回一个绑定了this对象的相同方法。上面的代码修改一行就可以实现绑定this在a对象上目的。
代码如下:
var a ={};
var func = function(x) {
console.log(this);
};
a.onclick = function() {
var x = 100;
func.bind(this)(x); // bind here
};
a.onclick();


这样,onclick事件的this就不会像无头苍蝇一样到处乱跑啦。

call & apply

call和apply要放在一起讲,因为他们实在太像了。他们都支持多参数,而且第一个参数都是即将绑定的this对象,第二个参数则是他们的区别所在,call使用独立的参数作为调用方法的入参,apply使用一个数组作为入参。有的时候我们并不是不想改变this对象,而是想人为的将他绑定到别的对象上,这个时候call和apply是很好用的。(并不是说不能用bind,不过貌似bind出现的比较晚,可能浏览器兼容性不好)。举个栗子:
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func();
}
console.log(a.x);
console.log(b.x);


上面的a和b对象中都有x,我们希望func能针对性的修改对应的x,但是直接调用只可能修改func作用域中的x,也就是a.x。修改一下代码,就可以实现修改b.x目的
代码如下:
a = {
func: function() {
this.x += 1;
},
x: 0
};
b = {
a: a,
x: 20
};
for(var i = 0; i < 10; i++){
b.a.func.call(b); // bind this to b
}
console.log(a.x);
console.log(b.x);


这个栗子举得不好,有点牵强附会,而且这是一种很容易让人迷惑的代码风格,有适用的场景,但不是处处都可用。

JavaScript刷新页面的几种方法总结

1,reload 方法

该方法强迫浏览器刷新当前页面。

语法:location.reload([bForceGet])

参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新")

2,replace 方法

方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过“前进”和“后退”来访问已经被替换的URL。

语法: location.replace(URL)

通常使用: location.reload() 或者是 history.go(0) 来做。

此方法类似客户端点F5刷新页面,所以页面method="post"时,会出现"网页过期"的提示。 因为Session的安全保护机制。

当调用 location.reload() 方法时, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。

如果有这种应用: 需要重新加载该页面,也就是说期望页面能够在服务端重新被创建,期望是 Not IsPostback 的。

这里,location.replace() 就可以完成此任务。被replace的页面每次都在服务端重新生成。

代码:

location.replace(location.href);

返回并刷新页面:

location.replace(document.referrer);

document.referrer //前一个页面的URL

不要用 history.go(-1),或 history.back();来返回并刷新页面,这两种方法不会刷新页面。

附:Javascript刷新页面的几种方法:

history.go(0)

location.reload()

location=location

location.assign(location)

document.execCommand('Refresh')

window.navigate(location)

location.replace(location)

document.URL=location.href

自动刷新页面的方法:

1,页面自动刷新:把如下代码加入<head>区域中

<meta http-equiv="refresh" content="20">

其中20指每隔20秒刷新一次页面.

2,页面自动跳转:把如下代码加入<head>区域中

<meta http-equiv="refresh" content="20;url=http://www.baidu.com">

其中20指隔20秒后跳转到http://www.baidu.comt页面

3,页面自动刷新js版

<script type="text/javascript">

function myrefresh()

{

window.location.reload();

}

setTimeout('myrefresh()',1000); //指定1秒刷新一次

</script>

4,JS刷新框架的脚本语句

//刷新包含该框架的页面用

<script type="text/javascript">

parent.location.reload();

</script>

//子窗口刷新父窗口

<script type="text/javascript">

self.opener.location.reload();

</script>

(或<a href="javascript:opener.location.reload()" rel="external nofollow" >刷新</a> )

//刷新另一个框架的页面用

<script type="text/javascript">

parent.另一FrameID.location.reload();

</script>

如果想关闭窗口时刷新或想开窗时刷新,在<body>中调用以下语句即可。

<body onload="opener.location.reload()"> 开窗时刷新

<body onUnload="opener.location.reload()"> 关闭时刷新

<script>

window.opener.document.location.reload()

</script>

以上所述是小编给大家介绍的JavaScript刷新页面的几种方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!JavaScript实现页面跳转的几种常用方式_javascript技巧


本文实例讲述了JavaScript实现页面跳转的几种常用方式。分享给大家供大家参考,具体如下:

第一种:

第二种:


第三种:


第四种:


第五种:


javascript中弹出选择框跳转到其他页面

javascript中弹出提示框跳转到其他页面


补充:window.location="";和 location.replace("");有什么区别?

这两个都能让网页导向令一个网址,那么有什么区别呢?比如能带参数,不能带参数之类的.
Replace?还是Reload()?
好像没什么区别吧?没试过

replace(),reload()是重新加载本页,而replace()可以导向另外一个URL

给你举个例子:

我们现在有3个页面(a.html, b.html, c.html).
默认打开a.html页面,然后在a.html页面中通过一个链接转向a.html页面。

现在,我在b.html页面中用window.location.replace("c.html");与用window.location.href("c.html");分别进入c.html页面.

从用户界面来看是没有什么区别的,但是现在c.html页面有一个“返回”按钮,
用window.location.href("c.html");

进入c.html页面时,c.html页面中的调用window.history.go(-1);wondow.history.back();进入c.html页面时,一点这个"返回"按钮就要返回b.html页面的话,
而如果用window.location.replace("c.html");进入c.html页面的话,
c.html页面中的调用window.history.go(-1);wondow.history.back();方法是不好用的,会返回到a.html.

因为window.location.replace("c.html");是不会向服务器发送请求而进行跳转,而window.history.go(-1);wondow.history.back();方法是根据服务器记录的请求决定该跳到哪个页面的,所以会跳到系统默认页面a.html 。

window.location.href("c.html");是向服务器发送请求的跳转,window.history.go(-1);wondow.history.back();方法是根据服务器记录的请求决定该跳到哪个页面的,所以就可以返回到b.html。

希望本文所述对大家JavaScript程序设计有所帮助。

JavaScript实现页面跳转的几种常用方式_javascript技巧


本文实例讲述了JavaScript实现页面跳转的几种常用方式。分享给大家供大家参考,具体如下:

第一种:

第二种:


第三种:


第四种:


第五种:


javascript中弹出选择框跳转到其他页面

javascript中弹出提示框跳转到其他页面


补充:window.location="";和 location.replace("");有什么区别?

这两个都能让网页导向令一个网址,那么有什么区别呢?比如能带参数,不能带参数之类的.
Replace?还是Reload()?
好像没什么区别吧?没试过

replace(),reload()是重新加载本页,而replace()可以导向另外一个URL

给你举个例子:

我们现在有3个页面(a.html, b.html, c.html).
默认打开a.html页面,然后在a.html页面中通过一个链接转向a.html页面。

现在,我在b.html页面中用window.location.replace("c.html");与用window.location.href("c.html");分别进入c.html页面.

从用户界面来看是没有什么区别的,但是现在c.html页面有一个“返回”按钮,
用window.location.href("c.html");

进入c.html页面时,c.html页面中的调用window.history.go(-1);wondow.history.back();进入c.html页面时,一点这个"返回"按钮就要返回b.html页面的话,
而如果用window.location.replace("c.html");进入c.html页面的话,
c.html页面中的调用window.history.go(-1);wondow.history.back();方法是不好用的,会返回到a.html.

因为window.location.replace("c.html");是不会向服务器发送请求而进行跳转,而window.history.go(-1);wondow.history.back();方法是根据服务器记录的请求决定该跳到哪个页面的,所以会跳到系统默认页面a.html 。

window.location.href("c.html");是向服务器发送请求的跳转,window.history.go(-1);wondow.history.back();方法是根据服务器记录的请求决定该跳到哪个页面的,所以就可以返回到b.html。

希望本文所述对大家JavaScript程序设计有所帮助。

如何编写高质量JS代码(续)_javascript技巧

继续上一篇文章《如何编写高质量JS代码》今次整理一下javascript函数知识点。

2.使用函数

函数给程序员提供了主要的抽象功能,又提供实现机制。函数可以实现其他语言中的多个不同的特性,例如,过程、方法、构造函数,甚至类或模块。

2.1 理解函数调用、方法调用以及构造函数调用之间的不同

针对面向对象编程,函数、方法和类的构造函数是三种不同的概念。

使用模式:

1,函数调用

代码如下:

function hello(username){

return "hello" + username;

}

2,方法调用

代码如下:

var obj = {

hello : function(){

return "hello , " + this.username;

},

username : "floraLam"

};

ohj.hello();//"hello , floraLam"

this变量被绑定到对象是由于hello方法被定义在obj对象中,我们也可以子啊另外一个对象中赋值一份相同的函数引用,并得到相同的答案。

代码如下:

var obj2 = {

hello : obj.hello(),

username : "floraLam"

};

3,构造函数使用

代码如下:

function User(name,passwordHash){

this.name = name;

this.passwordHash = passwordHash;

}

使用new操作符来调用User则视为构造函数。

代码如下:

var u = new User("floraLam","123");

与函数调用和方法调用不同的是,构造函数调用将一个全新的对象作为this变量的值,并隐式返回这个新对象作为调用结果。构造函数的主要职责是初始化该新对象。

2.2 熟练掌握高阶函数

高阶函数无非是那些将函数作为参数或返回值的函数,将函数作为参数(通常称为回调函数,因为高阶函数"随后调用"它)是一种特别强大、富有表现力的惯用法,也在js程序中被大量使用。

考虑数组的标准sort方法,为了对所有数组都能工作,sort方法需要调用者决定如何比较数组中的任意两个元素。

代码如下:

function compareNumber(x,y){

if(x < y){

return -1;

}

if(x > y){

return 1;

}

return 0;

}

[3,1,4,1,5,9].sort(compareNumbers);//[1,1,3,4,5,9]

代码如下:

[3,1,4,1,5,9].sort(function(x,y){

if(x < y){

return -1;

}

if(x > y){

return 1;

}

return 0;

});//[1,1,3,4,5,9]

上述例子使用一个匿名函数进一步简化。

学会使用高阶函数通常可以简化代码并消除繁琐的样板代码。简单的转换字符串数组的操作我们可以使用循环这样实现:

代码如下:

var names = ["Fred","Wilma","Pebbles"];

var upper = [];

for(var i = 0,n = names.length ;i< n;i++){

upper[i] = names[i].toUpperCase();

}

upper;//["FRED","WILMA","PEBBLES"];

使用数组便利的map方法,可以消除循环,仅仅使用一个局部函数就可以对元素的逐个转换。

代码如下:

var names = ["Fred","Wilma","Pebbles"];

var upper = names.map(function(name){

return name.toUpperCase();

});

upper;//["FRED","WILMA","PEBBLES"];

另外,例如我们想创建若干个方法创建不同的字符串,具有共同的实现逻辑,每个循环通过连接每个部分的计算结果来创建一个字符串。

代码如下:

function bulidString(n,callback){

var result = "";

for(var i = 0 ; i < n ;i++){

result += callback(i);

}

return result;

}

var alphabet = bulidString(26,function(i){

return String.fromCharCode(aIndex + i);

});

alphabet;//"abcdefghijklmnopqrxtuvwxyz";

var digits = buildString(10,function(i){ return i;})

digits;//"0123456789"

var random = buildString(9,function(){

random += String.fromCharCode(Math.floor(Math.random()*26)+aIndex

});

random;//"yefjmcef"(随机)

这样能够使得读者更清晰了解该代码能做什么,无须深入实现细节。

备注

javascript返回指定范围的随机数(m-n之间)的公式:Math.random()*(n-m)+m

同时要注意题目要求,是否要求返回正整数

2.3调用模式

调用一个函数将会暂停当前函数的执行,传递控制权与参数给新的函数。 除了声明时定义的形式参数,每个函数会接收到两个新的附加参数:this和arguments。

this是个很重要的参数,并且它的值是由调用模式决定的。

以下是JavaScript中很重要的4个调用模式:

a. 方法调用模式the method invocation pattern

b. 函数调用模式the function invocation pattern

c. 构造器调用模式the constructor invocation pattern

d. Apply调用模式the apply invocation pattern

这些模式在如何初始化关键参数this上存在差异

1. 方法调用模式the method invocation method

当函数作为对象的方法的时候,我们就叫函数为方法。当一个方法被调用的时候,this绑定到调用的对象。

代码如下:

var myObj={

val:0,

increment:function(inc){

this.val+=typeof inc ==="number"? inc:1;

},

get_val:function(){return this.val;}

}

myObj.increment();// 1

myObj["increment"](2);//3

小结:

1、通过this可取得它们所属对象的上下文的方法称为公共方法

2、当用 .或者下标表达式 来使用一个函数的时候,就是方法调用模式,this对象绑定到前面的对象。

3,一个函数可以使用this来访问对象,所以它能检索对象的值或者更改对象的值。绑定this到对象发生在调用的时候。

2. 函数调用模式the function invocation pattern

当一个函数不是一个对象的属性,那么它就是作为函数来调用的。当一个函数作为函数调用模式来调用的时候,this绑定到全局对象。这是JavaScript设计时的错误并延续了下来。

代码如下:

function add(x,y){

return x+y;

}

myObj.double=function(){

var that=this;

var helper=function(){

that.val=add(that.value,that.value);

//错误的写法可能是这样,为什么错呢?因为函数作为内部函数调用的时候,this已经绑定到了错误的对象,全局对象并没有val属性,所以返回不正确的值。

//this.val = this.val+this.val;

}

helper();

}

myObj.double();//6

3. 构造器调用模式the constructor invocation pattern

JavaScript是一门基于原型继承的语言,这意味着对象可以直接继承属性从其它的对象,该语言是无类别的。

如果在一个函数前面带上new来调用,那么将得到一个隐藏连接到该函数的prototype成员的新对象,同时this也将会绑定到该新对象。

new前缀也会改变return语句的行为。这也不是推荐的编程方式。

代码如下:

var Foo = function(status){

this.status = status;

}

Foo.prototype.get_status = function(){

return this.status;

}

//构造一个Foo实例

var myFoo = new Foo("bar");

myFoo.get_status();//"bar"

4. Apply调用模式the apply invocation pattern

因为JavaScript是一个函数式的面向对象语言,所以函数可以拥有方法。

Apply方法拥有两个参数,第一个是将绑定到this的值,第二个是参数数组,也就是说Apply方法让我们构建一个数组并用其去调用函数,即允许我们选择this的值,也允许我们选择数组的值。

代码如下:

var array = [3,4];

var sum = add.apply(null,array); // 7

var statusObj = {status:"ABCDEFG"};

Foo.prototype.pro_get_status = function(prefix){

return prefix +"-"+this.status;

}

var status = Foo.prototype.get_status.apply(statusObj);// "ABCDEFG"

var pro_status = Foo.prototype.get_status.apply(statusObj,["prefix"]);// "prefix -ABCDEFG"

通常情况下,函数或方法的接收者(级绑定到特殊关键字this的值)是由调用者的语法决定性的。特别地,方法调用语法将方法被查找对象绑定到this变量。然而,有时需要使用自定义接收者来调用函数。这时候就需要使用call方法或者bind方法自定义接收者来调用方法

2.4 使用bind方法提取具有确定接受者的方法

由于方法与值为函数的属性没有区别,因此也容易提取对象的方法并提取出函数作为回调函数直接传递给高阶函数。

但这也很容易忘记将提取出来的函数的接受着绑定到该函数被提取出的对象上。

代码如下:

var buffer = {

entries: [],

add :function(s){

this.entries.push(s);

}

}

var source = ["867","-","5309"];

source.forEach(butter.add);//error:entries is undefined

这个时候butter.add的接受者不是butter对象。函数的接收者取决于它是如何被调用的,forEach方法在全局作用域中被调用,因此forEach方法的实现使用全局对象作为默认的接收者,由于全局对象中没有entries属性,因此这段代码抛出错误。

forEach方法允许调用者提供一个可选的参数作为回调函数的接收者。

代码如下:

var source = ["867","-","5309"];

source.forEach(butter.add,butter);

但并非所有高阶函数都细心周到为使用者提供回调函数的接收者。

解决方法有两种:

1)创建一个显式地一buffer对象方法的方式调用add的封装函数。不管封装函数如何被调用,它总能确保将其参数推送到目标数组中。

代码如下:

var source = ["867","-","5309"];

source.forEach(function(s){

butter.add(s);

});

2)函数对象的bind方法需要一个接收者对象,并产生一个以该接收者对象的方法调用的方法调用原来的函数的封装函数。

代码如下:

var source = ["867","-","5309"];

source.forEach(butter.add.bind(buffer));

备注

buffer.add.bind(buffer)创建一个新函数而不是修改buffer.add函数:

buffer.add === buffer.add.bind(buffer); //false

js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)_javascript技巧

在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧。

前言

虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码。因此为了解决这个问题,人们开始使用以下几种方式来常见对象。

工厂模式

该模式抽象了创建对象的具体过程,用函数来以特定接口创建对象的细节

工厂模式测试

工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型)

构造函数模式

构造函数模式测试

注意构造函数与工厂模式有些不同的地方,如下

构造函数首字母大写

没有显式地创建对象

将属性和方法赋值给了 this 对象

没有return语句

而且以这种方式来调用构造函数会大致经历一下 几个步骤

创建一个新的对象

将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)

执行构造函数中的代码(即给新对象添加属性和方法的过程)

返回对象

注意:构造函数其实和普通的函数没有太大的差别,唯一的不同在于调用方式的不同。以下演示不同的几种调用方式

构造函数的问题:使用构造函数最主要的问题就是每个方法都要在每个实例上重新创建一次,p1与p2的都有show方法,但不是同一个Function的实例,因为function在js中也是一个对象。因此他们共有的show方法并不相等。

原型模式

每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。而这个对象的用途是 包含可以由 特定类型 的所有 实例 共享的属性和方法。即调用构造函数所创建的那个对象的 原型对象

好处是可以让所有对象的实例共享他的属性的方法。即无需在构造函数中定义实例的信息

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关资讯

热门话题

热门图文

  • 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋全文

    《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》高士谈全文:我本麋鹿姿,强服冠与簪。束缚二十年,梦寐游山林。朅来古晋国,官舍南城阴。凿壁取棘豁,开窗舒滞淫。山光射几席,野色供登临。怡颜盼庭柯,明目增遥岑。草木递荣落,云烟自浮沈。玩彼物色变,感此岁月侵。兀坐独无人,窥檐啭幽禽。谁知城市中,阒若郊居深。巷陋颜子乐,地偏陶令心。一室亦何有,狼藉书与琴。晴晖朝徙倚,皎月夜相寻。欲赋畔牢愁,先为梁父吟。诗成辄自和,酒熟时孤斟。结茅会有期,种竹当及今。日来官更忙,尘埃满衣襟。暮归唯惫卧,筋力殊不任。常思返丘壑,岂愿纡朱金。遥知北山处,猿鹤馀清音。

  • 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的朝代是什么

    《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》高士谈朝代:元代。《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》年代:元代。作者:高士谈。出生地:燕(今河北)人。去世时间:公元1146年。主要作品:《村行·墟落依林莽》《不眠·不眠披短褐》《减字木兰花·西湖睡起》《朝中措·琅琊山色最清雄》《玉楼春·少年人物江山秀》等。我们为您从以下几个方面提供予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的详细介绍。一、《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的全文 点此查看《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的详细内容。我本麋鹿姿,强服冠与簪。

  • 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的朝代

    《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》高士谈朝代:元代。《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》年代:元代。作者:高士谈。出生地:燕(今河北)人。去世时间:公元1146年。主要作品:《村行·墟落依林莽》《不眠·不眠披短褐》《减字木兰花·西湖睡起》《朝中措·琅琊山色最清雄》《玉楼春·少年人物江山秀》等。我们为您从以下几个方面提供予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的详细介绍。一、《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的全文 点此查看《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的详细内容。我本麋鹿姿,强服冠与簪。

  • 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋朝代

    《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》高士谈朝代:元代。《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》年代:元代。作者:高士谈。出生地:燕(今河北)人。去世时间:公元1146年。主要作品:《村行·墟落依林莽》《不眠·不眠披短褐》《减字木兰花·西湖睡起》《朝中措·琅琊山色最清雄》《玉楼春·少年人物江山秀》等。我们为您从以下几个方面提供予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的详细介绍。一、《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的全文 点此查看《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的详细内容。我本麋鹿姿,强服冠与簪。

  • 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的作者 予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的作者是什么]

    《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》高士谈作者:高士谈。《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》作者:高士谈。年代:元代。出生地:燕(今河北)人。去世时间:公元1146年。主要作品:《村行·墟落依林莽》《不眠·不眠披短褐》《减字木兰花·西湖睡起》《朝中措·琅琊山色最清雄》《玉楼春·少年人物江山秀》等。我们为您从以下几个方面提供予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋的详细介绍。一、《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的全文 点此查看《予所居之南下临短壑因凿壁开窗规为书室坐获山林之趣榜曰野斋且作诗约诸友同赋》的详细内容。我本麋鹿姿,强服冠与簪。

Top