比如,我们要让对象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数学运算用法总结》