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 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
jQuery中校验时间格式的正则表达式小结
Sep 22 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
javascript自动切换焦点控制效果完整实例
Feb 02 Javascript
jquery遍历json对象集合详解
May 18 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
AngularJS入门示例之Hello World详解
Jan 04 Javascript
用js制作淘宝放大镜效果
Oct 28 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
在vue中使用vuex,修改state的值示例
Nov 08 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
vue2.x数组劫持原理的实现
2020/04/19 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
应届毕业生个人求职自荐信
2014/01/06 职场文书
公司活动邀请函
2014/01/24 职场文书
模具专业自荐信
2014/05/29 职场文书
助学贷款贫困证明
2014/09/23 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
初婚初育证明范本
2015/06/18 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers
Python Numpy库的超详细教程
2022/04/06 Python
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers