JavaScript OOP(一)之构造函数与new命令
面向对象编程:Object Oriented Programming,简称OOP。
使用构造函数和new示例:
var O1=function(){
this.name='apple';
};
/**
* 1.函数名一般大写进行区分;构造函数内部使用了this关键字
* 2.生成对象,使用new
*/
var o2=new O1();
console.log(typeof o2,o2);
function O2(){
this.name='microsoft';
}
var o3=new O2();
console.log(typeof o3,o2);
console.log('---');
运行结果:

构造函数也可以带参数:
var Apple=function(){
this.weight=100;
};
var a=new Apple();//相当于var a=new Apple;
console.log(a.weight);
var Apple1=function(weight){
this.weight=weight;
}
var a1=new Apple1(10);
console.log(a1.weight);
如果构造函数未带参数,那么使用new命令时,可以省略()。
运行结果:

如果没有使用new命令调用构造函数:那么this指向全局对象或者说是顶层对象(即window)
function Blue(){
this.money=1000;
}
var b1=new Blue();
var b2=Blue();//window.money
console.log(b1,b2);
console.log(b1.money,window.money,money);
运行结果:(b2:undefined)

为了避免出现不加new调用构造函数的情况:1.使用严格模式;2.构造函数内部对this的指向进行判断
//避免出现不加new情况,使用'use strict';
//在严格模式下,函数内部this不允许指向全局对象window,默认等于undefined
function Cat(){
'use strict';
this.color='white';
}
//var c1=Cat();//报错,不能将属性color添加给undefined function Dog(){
//如果this不指向当前对象Dog,那么使用new生成实例对象
if(!(this instanceof Dog)){
return new Dog();
}
this.name='xiaoming';
}
var d1=Dog();
console.log(d1);
var d2=new Dog();
console.log(d2);
运行结果:

构造函数中存在return语句:ruturn对象,那么new 返回return的这个对象;否则return无效,返回this
console.log('---');
function Ele(){
this.name='nicai';
return 100;
}
var e1=new Ele();
console.log(e1);
function Ele1(){
this.name='apple';
return {
name:'blue',
calss:'super calss'
};
}
var e2=new Ele1();
console.log(e2);
console.log(e2.name);//blue
运行结果:

普通函数使用new调用:生成空对象
//注意与普通函数进行区分;普通函数:内部没有this关键字、函数名一般以小写开头
function fire(){
var s='this is a test function';
return s;
}
var f1=new fire();
console.log(f1,typeof f1);
运行结果:

new.target属性:
//函数内部使用new.target属性。如果函数被new调用,则new.target等于当前函数;否则,new.target等于undefined
function Gird(){
this.name='gird';
console.log(new.target===Gird);
}
var g1=new Gird();//true
var g2=Gird();//false
运行结果:

参考:阮一峰标准参考教程
JavaScript OOP(一)之构造函数与new命令的更多相关文章
- Javascript中构造函数与new命令
典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...
- Javascript中构造函数与new命令2
典型的面向对象编程语言(比如C++和Java),存在"类"(class)这个概念.所谓"类"就是对象的模板,对象就是"类"的实例.但是,在J ...
- 玩转JavaScript OOP[2]——类的实现
概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...
- JavaScript OOP 之 this指向
今天给大家分享一个JavaScript OOP中关于分辨this指向对象的小技巧,很实用呦! 我们先来看一段代码: 大家能判断出func();和obj.func();这两句的this指向吗? 首先,我 ...
- 使用JavaScript OOP特性搭建Web应用
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
- 玩转JavaScript OOP[3]——彻底理解继承和原型链
概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...
- javascript继承之借用构造函数与原型
javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
随机推荐
- Android Studio 3.0 使用问题解决方案总结
问题:创建新项目非常慢 问题描述: 更新到3.0版本后,出现创建新项目一直停留在如下图的界面: 选择等待?不知道要等到什么时候,这时候怎么办呢?显然,不能一直等待下去呀,需要想办法让他能尽快的加载好才 ...
- jQuery的区别:$().click()和$(document).on('click','要选择的元素',function(){})的不同
jQuery的出现,大大简化了对dom的操作,但是如果不是仔细阅读api和进行操作,就不知道其中最大的优点和使用方式.就拿$().click()和$(document).on('click','要选择 ...
- 对于Swift的Enum,文档上没有说的
今天无意发现一个东西, 但是在文档上看了很多遍都没找到, 但是亲测是可行的, 那到底是什么呢? 以前我们定义枚举 会这样: enum Hello { case Item( String, Int) c ...
- HDU1754 I hate it(线段树 单点修改)
好久没打线段树,来一道练练手,但说句实话,I really hate it!!!! 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管 ...
- Prime Ring Problem
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...
- Ignatius and the Princess IV(乱搞一发竟然过了)
B - Ignatius and the Princess IV Time Limit:1000MS Memory Limit:32767KB 64bit IO Format:%I64 ...
- replace to
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据. MySQL replace into 有三种形式: 1. repla ...
- awk练习题
1. sed和awk有什么区别? (1)awk:按列(域)操作:sed:按行操作 (2)awk:文本处理语言,适合对文本进行抽取处理:sed:非交互式的编辑器,适合对文本进行编辑 2. awk要处理域 ...
- canvas绘制旋转图形
将绘制到canvas上的要素进行旋转: 1.绘制时,通过操作画布的坐标轴状态:平移画布原点,旋转坐标轴等,达到旋转图形的目的 2.操作操作DOM元素,直接旋转canvas画布 操作画布的坐标轴状态: ...
- 详解tomcat的连接数与线程池
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...