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 相关文章推荐
document.getElementById获取控件对象为空的解决方法
Nov 20 Javascript
Javascript中获取对象的原型对象的方法小结
Feb 25 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
angular十大常见问题
Mar 07 Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
vue.js中created方法作用
Mar 30 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
Vue常用指令详解分析
Aug 19 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
May 06 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
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php实现水仙花数示例分享
2014/04/03 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
详解js常用分割取字符串的方法
2019/05/15 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
Python编程中的反模式实例分析
2014/12/08 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python绘制股票移动均线的实例
2019/08/24 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
程序员岗位职责
2013/11/11 职场文书
团员的自我评价
2013/12/01 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
市场营销求职信范文
2014/02/21 职场文书
创业培训计划书
2014/05/03 职场文书
建议书的格式
2014/05/12 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
离职证明范本
2015/06/12 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
react 路由Link配置详解
2021/11/11 Javascript
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python