面向对象的程序设计:

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、

  1. 取得对象中所有可枚举的实例属性,可以使用object.keys()方法,接受一个对象作为参数,返回一个包含所有可枚举属性的字符串数值
  2. 取得所有的实例属性,无论是否可枚举,使用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-面向对象的程序设计,函数表达式的更多相关文章

  1. js立即调用的函数表达式

    1.多种实现 // 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); ...

  2. js 立即调用的函数表达式

    当你声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括弧就可以实现自执行,例如foo(),看代码: // 因为想下面第一个声明的func ...

  3. JS学习笔记3_函数表达式

    1.函数表达式与函数声明的区别 函数声明有“提升”(hoisting)的特性,而函数表达式没有.也就是说,函数声明会在加载代码时被预先加载到context中,而函数表达式只有在执行表达式语句时才会被加 ...

  4. 7. javacript高级程序设计- 函数表达式

    1. 函数表达式 1.1 函数定义 函数定义的方式有两种:一种是函数声明,另一种就是函数表达式. (1). 函数声明:函数声明的重要特征就是函数声明提示,函数声明会在函数执行前执行 function ...

  5. JS高程3:函数表达式

    定义函数的方式有2种: 函数声明 函数表达式 函数声明是最常用的,函数声明的一个特征就是:在执行代码之前,就已经读取了函数声明. 这个特征还有一个专门的术语:函数声明提升. 递归函数 所谓递归函数,就 ...

  6. 2020/06/05 JavaScript高级程序设计 函数表达式

    函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...

  7. JS面向对象的程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  8. JS 立即执行的函数表达式(function)写法

    1. 正确的写法 对于JavaScript 来说,括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function ...

  9. js面向对象的程序设计 --- 下篇 继承启蒙

    继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...

随机推荐

  1. pycharm远程上传文件到Linux

    配置远程SFTP 1. 在PyCharm中打开SFTP配置面板,路径为Tools => Deployment => Configuration: 2. 配置Connection参数设置,填 ...

  2. Android Studio新建了一个项目提示Error:Unable to start the daemon process

    提示如下错误:

  3. iOS 本人必装插件

    本人觉得比较好用也实用的Xcode插件记录: 1. Alcatraz   插件通过它来管理 :    https://github.com/alcatraz/Alcatraz.git 2. Cocoa ...

  4. 解决客户端访问https报错

    现象: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.sun.net.ssl. ...

  5. XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据

    前言:通其他的功能处理一样,聊天也是通过模块发起的成为:“消息模块” 原理:1 current客户端开启通过消息模块开启并监听消息(监听通过代理). 2 当“current客户端”收到来自“other ...

  6. WdatePicker 开始日期不能大于结束日期,结束时间不能小于开始时间

    <input class="input_calendar inputcss" id="startDate" runat="server" ...

  7. 快速反编绎jar war包

    反编译这些class文件或jar包或war包,用TTools https://github.com/Supermax197/TTools [root@ok action]# tree /home/ok ...

  8. bzoj 1415 期望+记忆化搜索 ****

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAAIfCAIAAACzfDFhAAAgAElEQVR4nOy9bVwTW57vm5fnhed+Pn

  9. 微软改名部再次大显神威——ASP.NET 5改名ASP.NET Core 1.0

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在计算机科学领域只有两件难事:缓存不可用和命名.--Phil Karlton 今天,S ...

  10. Lucene.net 全文检索 盘古分词

    lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ...