js-面向对象的程序设计,函数表达式
面向对象的程序设计:
1、属性类型:数据属性、访问器属性
数据属性:wirtable:false –只读;如果尝试为它赋值,会忽略
Configurable:false—不能从对象中删除属性
在调用Object.defineProperty()方法时,如果不指定,configurable,enumerable(能否通过for-in循环输出对象的属性),writable的默认值是false;---直接在对象上定义的属性,其默认值是true
2、 构造函数以及工厂模式:
//工厂模式
function creatPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1=creatPerson("zhang",29,"yu");
var person2=creatPerson("zhanw",24,"yuw");
//构造函数
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
}
}
var person1=new Person("zhang",29,"yu");
var person2=new Person("zhanw",24,"yuw");
//构造函数中函数名一个字母大写,非构造函数应该以一个小写字母开头
//没有return语句,没有显式创建对象,直接属性与方法赋给this对象
3、将构造函数当做函数使用
var person=new Person("zhang",29,"zhhhh");
person.sayName(); //zhang
Person("zhang",78,"kk"); //添加到window
window.sayName(); //zhang
var 0=new Object();
Person.call(o,"zzz",23,"ddd");
o.sayName(); //zzz
4、原型对象:可以通过对象实例访问保存在原型中的值,不能通过对象实例重写原型中的值,在实例中添加了一个属性,该属性名与实例原型中的一个属性同名,那么就在实例中创建该属性,该属性会屏蔽原型中的那个属性,不过可以使用delete操作符删除实例属性,从而可以重新访问原型中的属性
5、
- 取得对象中所有可枚举的实例属性,可以使用object.keys()方法,接受一个对象作为参数,返回一个包含所有可枚举属性的字符串数值
- 取得所有的实例属性,无论是否可枚举,使用Object.getOwnPropertyNames()方法
6、组合使用构造函数以及原型模式:构造函数用于定义实例属性,原型模式用于定义方法以及共享的属性
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["a","b"];
}
Person.prototype={
constructor :Person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("zhang",29,"yu");
var person2=new Person("zhanw",24,"yuw");
person1.friends.push("zg");
alert(person1.friends); //"a,b,zg"
alert(person2.friends); //"a,b"
7、原型链的问题与借用构造函数
function SuperType(){
this.colors=["red","green","blue"];
}
function SubType(){
}
SubType.prototype=new SuperType();
var instance1=new SubType();
instance1.colors.push("black");
alert(instance1.colors);
var instance2=new SubType(); //"red,green,blue,black"
alert(instance2.colors); //"red,green,blue,black"
//借用构造函数
function SuperType(){
this.colors=["red","green","blue"];
}
function SubType(){
//继承了SuperType属性
SuperType.call(this);
}
var instance1=new SubType();
instance1.colors.push("black");
alert(instance1.colors);
var instance2=new SubType(); //"red,green,blue,black"
alert(instance2.colors); //"red,green,blue"
//SubType的每个实例都会具有自己的属性副本
//apply()与call()方法可以在将来创建的对象上执行构造函数
8、借用构造函数的优势,即可以在子类型构造函数中向超类型构造函数传递参数
function SuperType(){
this.name=name;
}
function SubType(){
//继承了SuperType属性,同时还传递了参数
SuperType.call(this,"zhang");
this.age=29;
}
var instance1=new SubType();
alert(instance.name);
alert(instance.age);
9、将原型链与借用组合函数组合在一起(继承):原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承
10、寄生式继承:
function createAnother(original){
var clone=object(original);
clone.sayHi=function(){
alert("hi");
};
return clone;
}
var Person={
name:"zhang",
friends:["z","zz","zzz"]
};
var anotherPerson=createAnother(person);
anotherPerson.sayHi(); //"hi"
函数表达式:
1、函数表达式:
var functionName=function(arg1,arg2){
函数体
};
函数表达式与其他表达式一样,在使用前必须赋值
2、var sayHi;
if(condition){
sayHi=function(){
alert("hi");
};
}else{
sayHi=function(){
alert("uo");
};
}
3、递归函数是一个函数通过名字调用自身,在调用自身函数的时候,使用arguments.callee代替函数名
4、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式就是子啊函数内部创建另一个函数
内部函数的作用域包含了外部函数的作用域
在匿名函数从外部函数被返回后,它的作用域被初始化为包含外部函数的活动对象以及全局变量对象,匿名函数就可以访问在外部函数定义的所有变量,外部函数执行完毕后,其活动对象也不会销毁,直至匿名函数被销毁后,外部函数的活动对象才会被销毁
5、function assignHandler(){
var element=document.getElementById("some");
element.onclick=function(){
alert(element.id);
};
}
//只要匿名函数存在,element的引用至少是1,因此它占用的内存就永远回收不了
function assignHandler(){
var element=document.getElementById("some");
var id=element.id;
element.onclick=function(){
alert(id);
};
element=null;
}
//闭包会引用包含函数的整个活动对象,其中包含element
//即使闭包不直接引用element,包含函数的活动对象也依然会保存一个引用,所有element=null,解除对DOM对象的引用
6、调用函数的方式是在函数名称后面添加一对圆括号
将函数声明转化为函数表达式:
(function(){
})();
7、在匿名函数中定义的任何变量在执行结束后会被销毁
js-面向对象的程序设计,函数表达式的更多相关文章
- js立即调用的函数表达式
1.多种实现 // 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); ...
- js 立即调用的函数表达式
当你声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括弧就可以实现自执行,例如foo(),看代码: // 因为想下面第一个声明的func ...
- JS学习笔记3_函数表达式
1.函数表达式与函数声明的区别 函数声明有“提升”(hoisting)的特性,而函数表达式没有.也就是说,函数声明会在加载代码时被预先加载到context中,而函数表达式只有在执行表达式语句时才会被加 ...
- 7. javacript高级程序设计- 函数表达式
1. 函数表达式 1.1 函数定义 函数定义的方式有两种:一种是函数声明,另一种就是函数表达式. (1). 函数声明:函数声明的重要特征就是函数声明提示,函数声明会在函数执行前执行 function ...
- JS高程3:函数表达式
定义函数的方式有2种: 函数声明 函数表达式 函数声明是最常用的,函数声明的一个特征就是:在执行代码之前,就已经读取了函数声明. 这个特征还有一个专门的术语:函数声明提升. 递归函数 所谓递归函数,就 ...
- 2020/06/05 JavaScript高级程序设计 函数表达式
函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...
- JS面向对象的程序设计
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- JS 立即执行的函数表达式(function)写法
1. 正确的写法 对于JavaScript 来说,括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function ...
- js面向对象的程序设计 --- 下篇 继承启蒙
继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...
随机推荐
- 【jquery】字符ascii码转换函数
js 字符ascii码转换函数 字符转ascii码:用charCodeAt();ascii码砖字符:用fromCharCode(); 看一个小例子 <script> str="A ...
- 本地Yum
1. mkdir xxx #新建文件夹 (新建一个挂载需要的文件夹) 2.配置本地yum源(挂载光盘) 3.进入 yum.repos.d 4.ls (查看当前文件夹全部的文件) 并 mv 修改 除 ...
- August 18th 2016 Week 34th Thursday
Comedy is acting out optimism. 喜剧就是将乐观演绎出来. Being optimistic or pessimistic, that is all about your ...
- C# 类中索引器的使用二
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...
- hdu 1541 Stars
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 思路:要求求出不同等级的星星的个数,开始怎么也想不到用树状数组,看完某些大神的博客之后才用树状数 ...
- EmguCV学习 与opencv的区别和联系
openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作.不过opencv有 ...
- Loadrunner中Throughput(吞吐量)的分析与计算
Throughput翻译为吞吐量,按照常规理解网络吞吐量表示在单位时间内通过网卡数据量之和,其中即包括本机网卡发送出去的数据量也包括本机网卡接收到的数据量,但这个理解在Loadrunner记录的Thr ...
- 【转载】有哪些省时小技巧,是每个Linux用户都应该知道的
http://www.cnblogs.com/amberly/p/4352682.html
- SQL 参数,传入参数和自己申明参数——异常抛出
ALTER PROCEDURE [dbo].[OA_RemoveProject] @Password nvarchar(30), --这是传入的参数 @ProjectNo nvarchar(8) AS ...
- ASP.NET 客户端静态文件请求设置缓存(Client Cache)
通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存 ...