javascript 原型与原型链的理解及应用实例分析(2)

比如,我们要让对象B继承于对象A,无非就是想要拿到对象A的属性和方法,这么一想,那通过把对象B的 __proto__  指向 对象A,不就可以实现了?

let A = { name: 'A', run() { console.log(this.name + ' run ...'); } }; console.log(A.name); A.run(); let B = {}; //让对象B的__proto__指向对象A B.__proto__ = A; //当对象B调用run()方法时会在自身上找,如果没找到,则通过__proto__向上找 //由于__proto__指向对象A,所以最终会在对象A中找到run()方法 B.run(); B.__proto__.name = 'B'; console.log(A.name); console.log(B.name);

这样有一个问题,当修改 B.__proto__.name = 'B'; 时,对象A也会受到影响。

我们可以通过ES5提供的 Object.create() 来解决此问题,Object.create()可以通过指定的 原型对象 创建一个新对象。

let A = { name: 'A', run() { console.log(this.name + ' run ...'); } }; console.log(A.name); A.run(); let B = {}; //通过Object.create()创建一个以对象A为原型对象的新对象 //让对象B的__proto__指向该新对象 //这样再操作B.__proto__中的属性就与对象A无关了。 B.__proto__ = Object.create(A); B.run(); B.__proto__.name = 'B'; console.log(A.name); console.log(B.name);

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/427341a2ed91278488cb855a35f95daf.html