javascript 面向对象 new 关键字 原型链 构造函数
JavaScript面向对象
JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构
- 构造函数的首字母大写,区分一般函数。
- 函数体内部使用了this关键字,代表了所要生成的对象实例。
- 生成对象的时候,必须使用new命令。
- 构造函数内部使用严格模式 'use strict',防止当做一般函数调用,这样就会报错。
function Person(name, age, sex) {
'use strict';
this.name = name;
this.age = age;
this.sex = sex;
}
Person() 报错
new Person("zhangxc", 29, "male");
1、new关键字 命令内部实现
function _new(constructor, params) { // 接受个数不确定参数,第一个参数:构造函数;第二个到第n个参数:构造函数传递的参数。
// 1. 首先将参数组成一个数组
// 首先 .slice 这个方法在不接受任何参数的时候会返回 this 本身,这是一个 Array.prototype 下的方法,因此 this 就是指向调用 .slice 方法的数组本身。
var args = Array.prototype.slice.call(arguments); // arguments伪数组,获取函数的所有参数的伪数组。
// 等价于
// [].slice.call(arguments);
// 2. 获取构造函数
var constructor = args.shift(); // shift()返回数组第一个元素
// 3. 使用构造函数原型创建一个对象。我们希望以这个现有的对象作为模板,生成新的实例对象,这时就可以使用Object.create()方法。
var context = Object.create(constructor.prototype); // Object.create()参数是一个对象,新建的对象继承参数对象的所有属性
// 4. 将参数属性附加到对象上面
var result = constructor.apply(context, args);
// 5. 返回一个对象
return (typeof result === 'object' && result != null) ? result : context;
}
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
var args1 = _new(Person, "zhangxc", 18, "male");
// {name: "zhangxc", age: 18, sex: "male"}
var args2 = new Person("zhangxc", 18, "male");
// {name: "zhangxc", age: 18, sex: "male"}
new.target属性
如果当前函数是new命令调用,new.target指向当前函数(构造函数的名称),否则为undefined。
function Test() {
console.log(new.target === Test);
}
Test() // false
new Test() // true
2、this关键字
this总是指向调用该方法的对象,在最外面调用就指向window
3、对象的继承
JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现。
prototype原型对象
- 每一个函数都有一个原型对象
- 每一个实例对象都有一个 __proto__属性
JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享。也就是说,如果属性和方法定义在原型上,那么所有实例对象就能共享,不仅节省了内存,还体现了实例对象之间的联系。原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因,而实例对象可以视作从原型对象衍生出来的子对象。
// 定义水果构造函数
function Fruit(name, color) {
this.name = name;
this.color = color;
}
// 实例化apple对象
var apple = new Fruit("apple", "red");
// 实例化banana 对象
var banana = new Fruit("banana", "yellow");
// 如果他们有共同的属性和方法那么就使用 prototype
// 修改 Fruit构造函数
Fruit.prototype.address = "china";
Fruit.prototype.eat = function() {
console.log(this.name + "-----" + this.color);
}
apple.addess // china
banana.address // china
apple.eat() // apple ---- red
banana.eat() // banana ---- yellow
function M1() {
this.hello = 'hello';
}
function M2() {
this.world = 'world';
}
**// 1、继承M1,M2自己的属性和方法(hasOwnProperty)**
function S() {
M1.call(this);
M2.call(this);
}
**// 2、继承M1原型链上的属性和方法**
S.prototype = Object.create(M1.prototype);
**// 3、继承M2原型链上的属性和方法**
Object.assign(S.prototype, M2.prototype);
// 指定构造函数
S.prototype.constructor = S;
var s = new S();
s.hello // 'hello'
s.world // 'world'
4、原型链
最透彻的原型链讲解 哈哈
**1. 每一个函数都有prototype属性指向他的原型对象**
**2. 每一个对象都有__proto__属性指向他的原型对象**
然后以Date()时间 构造函数为例讲解
证明:
var data = new Date();
因为:
data是一个实例对象所以他有__proto__属性指向他的原型对象
Date是一个构造函数所以他有prototype属性指向他的原型对象
所以:Date.prototype == data.__proto__ // Date{} true
data.__proto__是一个对象
因为:javascript规定所有对象都有原型
所以: data.__proto__.__proto__ == Object.prototype // true
这就是原型链了 data.__proto__.__proto__
data对象继承了 Date Object 原型对象的属性和方法。
来源:https://segmentfault.com/a/1190000018140664
javascript 面向对象 new 关键字 原型链 构造函数的更多相关文章
- JavaScript之继承(原型链)
JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...
- [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- JavaScript的面向对象原理之原型链详解
一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说“JavaScript是基于原型的!”.然后就没什么好说的了,hr可能不知 ...
- JavaScript的面向对象原理之原型链
二.JavaScript的对象 为了能够清楚的解释这一切,我先从对象讲起.从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的. 实际上在JS ...
- JavaScript面向对象编程(二)构造函数和类
new关键字和构造函数 在文章JavaScript面向对象编程(一)原型与继承中讨论啦JavaScript中原型的概念,并且提到了new关键字和构造函数.利用new关键字构造对象的实例代码如下: // ...
- javascript 创建对象及对象原型链属性介绍
我们知道javascript里定义一个普通对象的方法,如: let obj = {}; obj.num = 1; obj.string = 'string'; obj.func = function( ...
- JavaScript高级内容:原型链、继承、执行上下文、作用域链、闭包
了解这些问题,我先一步步来看,先从基础说起,然后引出这些概念. 本文只用实例验证结果,并做简要说明,给大家增加些印象,因为单独一项拿出来都需要大篇幅讲解. 1.值类型 & 引用类型 funct ...
- javascript精髓篇之原型链维护和继承.
一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了. 其实啊,光靠这一个属性是无法完成jav ...
- javascript中继承(一)-----原型链继承的个人理解
[寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...
随机推荐
- Tomcat上进行项目部署与WAR包含义
一.WAR包 1.与JAR包类似,是将java类(编译好的.class)和Web资源,压缩后生成压缩包. 2. 与JAR相比,多了WEB-INF文件夹,其它多出来的内容基本都是Web资源 WEB-IN ...
- 零基础在Linux服务器上部署javaweb项目
本教程使用的工具下载链接:http://pan.baidu.com/s/1sl1qz2P 密码:43pj 一.安装JDK 1.首先要查看服务器的系统版本,是32位还是64位 #getconf LONG ...
- A Secure Cookie Protocol 安全cookie协议 配置服务器Cookie
Title http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf AbstractCookies are the primary ...
- 原!linux脚本统计
#! /bin/sh first=$ first2=$ input2=$ let second=`date -d "-1 days ago ${input2}" +%Y%m%d` ...
- Ignatius and the Princess IV---hdu1029(动态规划或者sort)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1029 就是给你n(n是奇数)个数找出个数大于(n+1)/ 2 的那个数: n的取值范围是 n(1< ...
- 001-window下运行linux
一.概述 前提:有条件的情况下,自行安装 在windows上模拟linux环境,主要有三种方法: 1.VMware等虚拟机,缺点:占用系统资源多,运行速度慢. 2.Cygwin等模拟环境,用windo ...
- Java集合—Set(转载)
Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 HashSet是Set接口的典型实现,实 ...
- abap 开发之创建表维护生成器
在sap开发中有时需要对一些自建表维护数据,但又不想写程序,怎么办呢??这个时候我们可以直接生成个表维护生成器,为其定义一个事物码就ok了.以下是表格维护生成器的生成步骤. 首先我们需要先定义表.输入 ...
- MySQL整理(二)
一.MySQL操作表的约束 MySQL提供了一系列机制来检查数据库表中的数据是否满足规定条件,以此来保证数据库表中数据的准确性和一致性,这种机制就是约束. (1)设置非空约束(NOT NULL),唯一 ...
- mysql忘记密码怎么办?(转)
linux下mysql忘记密码处理方法: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码 ...