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 this关键字使用分析
Oct 21 Javascript
javascript 写类方式之九
Jul 05 Javascript
jQuery 打造动态下滑菜单实现说明
Apr 15 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
Feb 27 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
学习Node.js模块机制
Oct 17 Javascript
JavaScript实现一个空中避难的小游戏
Jun 06 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
Jul 10 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
vue-cli3跨域配置的简单方法
Sep 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中循环语句的用法介绍
2012/01/30 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
基于php下载文件的详解
2013/06/02 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
js自定义回调函数
2015/12/13 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
python3音乐播放器简单实现代码
2020/04/20 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
渔夫的故事教学反思
2014/02/14 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis