引言
- 世界上只有一种英雄主义,就是看清生活的真相后,依然热爱生活。
- 所谓的怀才不遇,其实只是你怀才不够
- 别人只能看结果,自己要独撑过程
- 职场里,没有人愿意被捏圆搓扁,可是只有强者才有“议价权”
- 余生,愿你历尽千帆,归来仍是少年。愿你熬过生活的苦,尝到岁月的甜。
proto(原型链)
每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法。 有如下特点:
- proto 为对象内部的隐藏属性
- proto 为实例化该对象的构造器的 prototype 对象的引用,因此可以直接方法 prototype 的所有属性和方法
- 除了 Object 每个对象都有一个 proto 属性且逐级增长形成一个链,原型链顶端是一个 Object 对象。在调用属性或方法时,引擎会查找自身的属性如果没有则会继续沿着原型链逐级向上查找,直到找到该方法并调用。
- proto 跟浏览器引擎实现相关,不同的引擎中名字和实现不尽相同(chrome、firefox中名称是 proto ,并且可以被访问到,IE中无法访问)。基于代码兼容性、可读性等方面的考虑,不建议开发者显式访问 proto 属性或通过 __proto__更改原型链上的属性和方法,可以通过更改构造器prototype 对象来更改对象的 proto 属性。
prototype
只有函数才有prototype属性,当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象 值是一个有 constructor 属性的对象,不是空对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)
常用使用方法
Object.prototype.hasOwnProperty 功能:判断一个属性是否是一个对象的自身属性
// objectInstance.hasOwnProperty("propertyName")var obj = Object.create({a: 1, b: 2});obj.c = 3;obj.hasOwnProperty('a'); // falseobj.hasOwnProperty('c'); // true
String.prototype.indexOf 功能:获取子字符串在字符串中的索引
var str = "I am X. From China!";var index = str.indexOf('a'); // 2str.indexOf('a', index + 1); // 16str.indexOf('Stupid'); // -1 字符串不存在
String.prototype.replace 功能:查找字符串替换成目标文字
// stringObject.replace(regexp/substr, replacement)var str = "apple is bad";str = str.replace('bad', 'awesome');
String.prototype.split 功能:按分隔符将分隔符分成字符串数组
// stringObject.split(separator, arrayLength)var str = '1 2 3 4';str.split(' '); // ['1', '2', '3', '4'];str.split(' ', 3); // ['1', '2', '3'];str.split(/\d+/); // ["", " ", " ", " ", ""]
Number.prototype.toFixed 功能:四舍五入至指定小数位
// numberObject.toFixed(num)var num0 = 3.14;num0.toFixed(1); // 3.1var num1 = 3.35;num1.toFixed(1); // 3.4
Array.prototype.splice 功能:从数组中删除或添加元素,返回被删除的元素列表(作用域原有数组)
// arrayObject.splice(start, deleteCount[, item1[, item2[, ...]]])var arr = ['1', '2', 'a', 'b', '6'];var ret = arr.splice(2, 2, '3', '4', '5'); // ['a', 'b']arr; // ['1', '2', '3', '4', 5', '6']
总结
JS正是通过__proto__和prototype的合作实现了原型链,以及对象的继承。 构造函数,通过prototype来存储要共享的属性和方法,也可以设置prototype指向现存的对象来继承该对象。
暂时写到这里吧 我自己也没有特别搞懂 后续再添加