了解对象

 什么是对象?
 
…… 这个就不说了

对象的声明的两种方式

 var person = new Object();
person.name="linchen";
person.age="18";
person.job="java"; var person={
name:"linchen",
age:"18",
job:"java"
}
 

对象的数据属性和访问器属性

懒得写了,这骚操作没啥用,给出相关链接:
https://blog.csdn.net/qq_17371033/article/details/52688195
 

创建对象

 

构造函数

构造函数也是函数,是比较特殊的函数。 
这种函数是用来创建对象的,就好比普通函数最后return一个对象一样。 
区别在于构造函数没有显式的创建对象,直接将属性和方法赋给了this,没有return语句。

例:

//构造函数:

    // 物质(属性:质量,速度,是否生物)
function Material(quality,speed,isLivingText) {
this.quality = (quality||0) + "kg";
this.speed = (speed||0) + "m/s";
this.isLiving = isLivingText == "生物";
this.setSpeed = function(num) {
this.speed = num + "m/s";
}
}
// 创建一个对象,需要用new关键字
var body1=new Material(50,5,"生物");
var body2=new Material(100,0,"非生物"); //用普通函数创建对象: function material(quality,speed,isLivingText) {
var obj={};
obj.quality = (quality||0) + "kg";
obj.speed = (speed||0) + "m/s";
obj.isLiving = isLivingText == "生物";
obj.setSpeed = function(num) {
obj.speed = num + "m/s";
}
return obj;
}
var body3=material();
var body4=material(100,0,"非生物");

这种用函数来封装以特定接口创建对象的细节的模式被称为工厂模式 
通过new关键字来创建对象的模式被称为构造函数模式

 

原型对象

1、任何函数都有一个属性:prototype (原型)

prototype指向一个原型对象

该原型对象包含由该构造函数创建的所有实例共享的属性和方法。

2、任何对象都有一个隐藏的属性: __proto__

__proto__属性的值指向该构造函数的原型对象。

3、任何原型对象都有一个属性:constructor (构造函数)

constructor指向该原型对象对应的构造函数。

4、原型对象也是对象,也会有一个__proto__属性

假如原型对象是另一个构造函数的实例,则形成原型链。

原型链的终点必是构造函数Object()的原型

其原型的__proto__属性值为null

5、原型对象的设置方法:

         // 修改单个属性或方法
Material.prototype.quality="0kg";
Material.prototype.setQuality = function(num) {
this.quality = num + "kg";
}; // 初始化原型对象
Material.prototype={
quality:"0kg",
setQuality:function(num) {
this.quality = num + "kg";
};
} // 原型对象是另一个对象的实例
Material.prototype=new Object();

6、原型对象是动态的,当我们对原型对象所做了任何修改都会在所有实例上反映出来。 
例:

 var body1=new Material();
body1.setSpeed(20); //body1.setSpeed is not a function
console.log(body1.speed);
Material.prototype.setSpeed=function(num){
this.speed=num+"m/s";
}
body1.setSpeed(40);
console.log(body1); // 40m/s
 

继承

 

什么是继承

一个对象获得另一个对象的所有属性和方法,这个操作叫做继承。

 

原型式继承

当构造函数a的原型等于构造函数b的实例时,形成一个原型链,通过这样的方式,a就拥有了b所有的属性和方法,这种方式叫做构造函数继承。

缺点: 
a创建出来的实例的继承于b的属性和方法都是共享的,改了其中一个实例的属性值,别的实例对应的属性值也会改变。

 

寄生式继承

通过在构造函数a中调用构造函数b来使a拥有了b所有的属性和方法。这种方式叫做寄生式继承。

使用apply()和call():

function B(name){
this.name=name;
}
function A(name,age){
B.call(this,name);
// B.apply(this,[name])
this.age=age;
}

apply()与call()详解: 
https://blog.csdn.net/ganyingxie123456/article/details/70855586 (别人写的)

缺点: 
a创建出来的实例不继承b的原型的属性和方法。如果把b的原型的属性和方法都写在b里面也就失去了函数复用的能力了。

 

组合继承(寄生组合式继承)

先使用寄生式继承来继承,再使用原型式继承。解决了以上两种方式各自的缺点。实例上的属性和方法会屏蔽原型上相同名的属性和方法。

 

demo

把下面代码复制到一个新建的.html文件,记得引入jquery,打开控制台看console

 <!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<script src="jquery1.42.min.js"></script>
</head> <body>
<div id="box1"></div>
<!-- 构造函数,实例 -->
<script id="js1">
// 构造函数,实例--------------------------------------------------
/**
按照惯例:
1、构造函数始终都应该以一个大写字母开头
2、非构造函数则应该以一个小写字母开头 与普通函数的区别:
1、没有显式地创建对象
2、直接将属性和方法赋给了this对象
3、没有return语句
*/ // 物质(属性:质量,速度,是否生物)
function Material(quality,speed,isLivingText) {
this.quality = (quality||0) + "kg";
this.speed = (speed||0) + "m/s";
this.isLiving = isLivingText == "生物";
this.setSpeed = function(num) {
this.speed = num + "m/s";
}
} // 这种用函数来封装以特定接口创建对象的细节的模式被称为工厂模式
// function material(quality,speed,isLivingText) {
// var obj={};
// obj.quality = (quality||0) + "kg";
// obj.speed = (speed||0) + "m/s";
// obj.isLiving = isLivingText == "生物";
// obj.setSpeed = function(num) {
// obj.speed = num + "m/s";
// }
// return obj;
// } // 创建实例,得到一个新对象
var body1 = new Material(50,0,"生物");
console.log(body1); // 继承----------------------------------------------------------
/**
* 继承的方式:
* 1、原型链(主要)(原型式继承)
* 2、借用构造函数(寄生式继承)
* 3、1和2组合继承 (寄生组合式继承)
*/ // 设置质量的方法(原型)
Material.prototype.setQuality = function(num) {
this.quality = num + "kg";
};
// 通过对象
Material.prototype.setOption = function(opt) {
opt = opt || {};
this.quality = (opt.quality || 0) + "kg";
this.speed = (opt.speed || 0) + "m/s";
this.isLiving = opt.isLivingText == "生物";
};
// 速度参照物(原型)
Material.prototype.reference = "地球表面";
body1.setQuality(25);
console.log(body1); // 非生物(构造函数)
function NonLivingThings() { }
// 原型式继承
NonLivingThings.prototype = new Material(null,null,"非生物");
NonLivingThings.prototype.constructor = NonLivingThings;
var nonLifeBody1 = new NonLivingThings();
console.log(nonLifeBody1); // 生物(构造函数)
function LivingThings() {
// 寄生式继承
Material.call(this,null,null,"生物"); //(call写法)
// Material.apply(this, ["生物"]);(apply写法)
this.lifeSpan = 0 + "年";
}
// 原型式继承 -- 因为前面已经实现了寄生式继承,所以实现了寄生组合式继承
// LivingThings.prototype = new Material("生物");
// LivingThings.prototype.constructor = LivingThings;
// 重写原型的setOption函数
// LivingThings.prototype.setOption = function() {
// return function(opt) {
// LivingThings.prototype.setOption.call(this, opt);
// this.lifeSpan = (opt.lifeSpan || 0) + "年";
// }
// }
var lifeBody1 = new LivingThings();
// lifeBody1.setOption({
// "quality": 20,
// "lifeSpan": 100
// });
console.log(lifeBody1);
</script>
<script id="js2">
// 创建一个对象,名为石头
var 石头 = new NonLivingThings("非生物");
石头.setOption({
"speed": 100
});
// 给物质添加一个run函数,传入节点,实现该节点块从左往右滑动
Material.prototype.run = function(dom) {
var $dom=$(dom);
$dom.css({
width: "100px",
height: "100px",
background: "red"
});
$dom.animate({
marginLeft: '+500px'
}, (500 / parseInt(this.speed || 100)) * 1000); };
石头.run("#box1");
</script>
</body> </html>

JavaScript学习(二)——深入学习js对象的原型与继承的更多相关文章

  1. JS对象与原型

    一. JS的对象 1.1 创建对象的几种方式 1.1.1 通过字面量创建对象 在js中,一对{} 其实就是一个对象 var person = { name: "tom", age: ...

  2. js中的原型、继承的一些想法

    最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...

  3. 最具有性价比的语言javascript之二,学习篇

    先祝福各位,国庆假期愉快!前面写了一篇 最具有性价比的语言javascript之介绍篇,引起了不少的争议. 有些人javascript吐槽,埋怨.我目前做的都是后台系统.每个人的工作经历和兴趣爱好不一 ...

  4. [Effective JavaScript 笔记]第4章:对象和原型--个人总结

    前言 对象是js中的基本数据结构.对象在js语言编码中也随处可见,比如经常会用到的函数,也是一个Function构造函数,Function.prototype原型对象.每当声明一个函数时,都会继承Fu ...

  5. js对象,原型,call,apply浅析

    //对象直接量,创建对象最简单的方式是在js里使用对象直接量 var book = { "main title": "js", //属性里有空格,要用引号 &q ...

  6. JS对象与原型链

    每个函数都存在一个prototype的属性,然后这个属性值为一个对象,我们称之为原型对象 每个对象都存在着一个隐藏的属性"__proto__" 这个属性引用了创建这个对象的函数的p ...

  7. JavaScript的类、对象、原型、继承、引用

    以CSS为例,有一种为所有class为"xxxx"的元素添加样式(外联样式),那么所有class为xxx的元素样式就会改变,在css中像下面这么写: <html> &l ...

  8. 深入理解JS对象和原型链

    函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...

  9. 从零开始的全栈工程师——JS面向对象( 原型 this 继承)

    一.生成对象的方式 ①单例模式(字面量定义)var obj = {} ②类的实例 var obj = new Object( ) ③工厂模式 ④构造函数:扮演三种角色 普通函数 普通对象 类 工厂模式 ...

随机推荐

  1. python 元组列表转为字典

    #create a list l = [(), (), (), (), (), ()] d = {} for a, b in l: d.setdefault(a, []).append(b) prin ...

  2. Springboot 学习笔记 之 Day 1

    SpringBoot快速入门 https://spring.io/ 1. SpringBoot简介Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个 ...

  3. js 转码思维

    <body> <script type="text/javascript"> // var el = document.createElement('scr ...

  4. tp3.x和tp 5的区别

    由于TP5.0是一个全新的颠覆重构版本,所以现在面试很多面试官喜欢问TP3.2和TP5之间的区别,那他们之间到底有哪些区别呢?一.目录  TP5目录 二.需要摒弃的 3.X 旧思想 模型的变动     ...

  5. Codeforces 447C - DZY Loves Sequences

    447C - DZY Loves Sequences 思路:dp 代码: #include<bits/stdc++.h> using namespace std; #define ll l ...

  6. 新的请求方式 fetch和axios

    参考链接:https://www.javascriptcn.com/read-5840.html axios使用文档: https://www.kancloud.cn/yunye/axios/2348 ...

  7. Java基础七-正则表达式

    Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...

  8. [Java代码] Java是自学好还是参加培训班好?

    ava 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. 本教程给大家简单介 ...

  9. javascript之非构造函数的继承

    这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是 ...

  10. 【模板/经典题型】带有直线限制的NE Latice Path计数

    平移一下,变成不能接触y=x+1. 注意下面的操作(重点) 做点p=(n,m)关于这条直线的对称点q=(m-1,n+1). ans=f(p)-f(q). 其中f(x)为从(0,0)到点x的方案数.