javascript面向对象程序设计实践常用知识点总结


Posted in Javascript onJuly 29, 2019

本文实例讲述了javascript面向对象程序设计实践常用知识点。分享给大家供大家参考,具体如下:

实践一:原型中的引用类型的属性是共享的

var Person = function(){};
Person.prototype = {
  info:{
    "name":"Tom"
  }
}
var p1 = new Person();
var p2 = new Person();
p1.info.name = '我是p1';
p2.info.name = '我是p2';
console.log(p1.info.name); // 我是p2
console.log(p2.info.name); // 我是p2

分析:p1,p2都是实例化出来的对象,p1.info 和p2.info 都是指向同一块堆内存,给p1.info.name赋值,和给p2.info.name赋值修改的都是同一个地方,由于代码从上到下依次执行,那么在console的时候自然都是打印出 '我是p2'。总结:由此可以看出原型内的引用类型的属性是共享的。

实践二:原型的引用类型,当实例化后并重新给引用类型属性赋值,地址发生变化。

var Person = function(){};
Person.prototype = {
  info:{
    "name":"Tom"
  }
}
var p1 = new Person();
var p2 = new Person();
p1.info = {"name":"哈哈"};;
console.log(p1.info.name); // 哈哈
console.log(p2.info.name); // Tom

分析:上面代码当执行到 p1.info = {"name":"哈哈"}的时候,p1的info这个引用类型的属性,指向了新的地址。而p2.info 没有做出任何修改,还是指向对象原型中的那个地址。

实践三:对象中值类型的属性不共享

var Person = function(name,age){
  this.name = name;
  this.age = age;
};
var p1 = new Person('Tom',10);
var p2 = new Person('Lucy','8');
console.log(p1.name); // Tom
console.log(p2.name); // Lucy

实践四:属性屏蔽理论

var Person = function () {
  this.name = '小明',
  this.buy = function () {
    console.log('去买面包');
  }
};
Person.prototype = {
  name:"原型中的小明",
  buy:function() {
    console.log('去买汽水');
  },
  age:10
}
var p = new Person();
// 正常情况下我们去访问p里的属性和方法。
// 可以看出原型中的属性和方法的优先级没有构造函数中的高,如果构造函数中没有,会去原型中查找
console.log(p.name);// 小明
p.buy();// 控制台输出 去买面包
console.log(p.age); // 10
// 如果我们要访问原型中的属性和方法可以这样
delete p.name; // 此处会删除构造函数中的属性
console.log(p.name);// 原型中的小明
Person.prototype.buy(); // 控制台输出 去买汽水

实践五:对象中的 hasOwnProperty 方法

var Person = function () {
  this.name = 'Tom';
}
Person.prototype = {
  age:30
}
var p = new Person();
console.log(Person.hasOwnProperty('name')); // true
console.log(p.hasOwnProperty('name')); // true
console.log(Person.hasOwnProperty('age')); // false
console.log(p.hasOwnProperty('age')); // false
var ClassRoom = {
  contain:100,
  leader:'小明',
  teacher:'王老师'
}
console.log(ClassRoom.hasOwnProperty('leader')); // true
console.log( p.hasOwnProperty === Object.prototype.hasOwnProperty ); //true
console.log( Person.hasOwnProperty === Object.prototype.hasOwnProperty ); //true
console.log( ClassRoom.hasOwnProperty === Object.prototype.hasOwnProperty ); //true

分析:上面说明了一个问题,hasOwnProperty 这个方法是看是不是对象自身下面的属性,可以用对象和实例对象访问,并且只会去找构造函数和字面量中的属性并且 hasOwnProperty 继承自 Object

实践六:自定义对象中的 constructor 和 __proto__(有关原型链的问题,我们以后再来说)

/* 每个实例对象都会默认生成一个constructor 和 __proto__ 属性 这一条不管是内置对象还是自定义对象都是一样的 */
function A() {};
var a = new A();
console.log(a.constructor === A); // true 默认情况下实例的constructor指向实例的构造函数
console.log(a.__proto__ === A.prototype); // true 默认情况下,实例的__proto__属性指向类的prototype
/* 当我们修改 constructor 和 __proto__ 属性时候 */
function B() {};
// 手动修改原型链
B.prototype = {
 __proto__:String.prototype
}
var b = new B();
// instanceof 用来判断obj1是否是obj2的一个实例,可见用 instanceof 来判断数据类型也是不准确的。
// 这里涉及到继承,而js面向对象中的继承就是通过原型链来实现的。
console.log(b instanceof B); // true
console.log(b instanceof String); // true
console.log(b instanceof Object); // true
console.log(b.constructor === B); // false 此处b的构造函数不是B了,因为原型链指到String上去了。
console.log(b.constructor === String); //true
// 手动修改b的constructor ,如果自己不设置,那么就会去寻找原型链,如上
//b.constructor = B; 或者 B.prototype.constructor = B;
// 手动设置后,就会按照设置的来走,如下:
b.constructor = B;
console.log(b.constructor === B); // true
console.log(b.__proto__=== B.prototype); // true
console.log(B.prototype.__proto__=== String.prototype); // true;
// 下面这两个也是原型链的内容
// B是函数,函数的constructor 是 Function,函数的__proto__ 是Function.prototype
console.log(B.constructor === Function); // true
console.log(B.__proto__ === Function.prototype); // true

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
微信jssdk用法汇总
Jul 16 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
Sep 18 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
Oct 17 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
js实现全选反选不选功能代码详解
Apr 24 Javascript
javascript中this的用法实践分析
Jul 29 #Javascript
学习LayUI时自研的表单参数校验框架案例分析
Jul 29 #Javascript
jquery.pager.js分页实现详解
Jul 29 #jQuery
javascript面向对象创建对象的方式小结
Jul 29 #Javascript
jquery.pager.js实现分页效果
Jul 29 #jQuery
vue-router跳转时打开新页面的两种方法
Jul 29 #Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 #Javascript
You might like
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
一个JavaScript变量声明的知识点
2013/10/28 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python实现批量下载文件
2015/05/17 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
医学生自荐信范文
2013/12/03 职场文书
合同专员岗位职责
2013/12/18 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
节约用电标语
2014/06/17 职场文书
十佳青年事迹材料
2014/08/21 职场文书
学习保证书怎么写
2015/02/26 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
师范生教育见习总结
2015/06/23 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python