比如
var a = [1,2,3];
a.prototype.b = function(){console.log(this)};
a.b();
这样写为什么是错的呢?
比如
var a = [1,2,3];
a.prototype.b = function(){console.log(this)};
a.b();
这样写为什么是错的呢?
prototype是构造函数的属性,它指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
你这里的a是实例而不是构造函数,要搞清楚面向对象这几个概念,看一下正确的写法,或许你就明白了
Array.prototype.b = function(){ console.log(this) }
var a = new Array(1,2,3) //或 var a = [1,2,3]
a.b() // [1,2,3]
建议看一下面向对象的相关知识
这个问题很有意思,不过首先要明确prototype
到底是指什么。
prototype
这个属性”,即a.prototype
存在吗,这是全部的答案在回答的。如果题主是对第一种情况感兴趣,可以继续看下去。
每个对象都有原型,这句话对,也不对,Object.create(null)
得到的对象没有原型,这一般是用来实现一个“纯净”的容器。
大部分情况下每个对象都有原型,当获取对象上的属性时,如果该对象上没有,就会去原型上寻找,这就是a.push(2)
可以执行的原因,a
没有push
方法,但a
的原型上有。
既然a
是有原型的,那可以修改吗,可以的。如果是在chrome
控制台可以简单实验下:
const a = [1, 2, 3];
a.__proto__.b = function () {console.log('b function ', this)};
a.b();
但__proto__
不是规范的,所以需要用Object.getPrototypeOf()
拿到后再修改。
const ary = [1, 2, 3];
const aryPrototype = Object.getPrototypeOf(ary);
aryPrototype.b = function () {console.log('b function ', this)};
ary.b();
Array.prototype.b = function(){console.log(this)};
这样应该就可以了,因为 a作为 Array原型的实例。
如果要访问某对象a的原型,需要这样写
Object.getPrototypeOf(a)
或者
a.constructor.prototype
如果a是构造函数,可以直接通过a.prototype访问,上面就是先调出a的构造函数
var a = [1, 2, 3];
Array.prototype.b = function(i) {
alert(this[i]);
};
a.b(a.length - 1);
13 回答12.8k 阅读
7 回答1.9k 阅读
5 回答1.4k 阅读
3 回答1.1k 阅读✓ 已解决
5 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答873 阅读✓ 已解决
函数(正常来说是构造函数)才有
prototype