为什么我不能在JavaScript的Object Literals中使用原型?

Lij*_*raj 5 javascript prototypejs

好吧,我很想了解javascript中的原型并发现了很多文章,但是我无法理解为什么我不能在javascript中的Object常量中使用原型。众所周知,一切都是从Object继承的,所以在这种情况下

function Dog() {
}

Dog.prototype = new Animal;
Dog.prototype.bark = function() {
    console.log("Woof! My name is " + this.name);
};
Run Code Online (Sandbox Code Playgroud)

如果我能够在函数中使用原型,为什么我不能在对象文字中使用原型,例如以下示例

 var obj = {
            firstname: 'foo',
            lastname:'bar'
        }
        // this throws an error
        obj.prototype.getMethod = function () {
            console.log('this is a function');
        }
Run Code Online (Sandbox Code Playgroud)

我经历了所有这些问题,但它确实无法回答为什么无法在JavaScript的对象文字中使用原型的原因。以下是一些参考

Refreence 1

Refreence 2

Refreence 3

Raj*_*amy 5

首先,.prototype属性属于函数对象。您无法从普通对象实例访问它。基本上,在构造实例.prototype的内部时将使用与构造函数相关的属性[[prototype]]。这里你有一个实例,如果你想把函数添加到它的原型链中,那么你必须修改它

var obj = { firstname: 'foo', lastname:'bar' };
var pro = Object.getPrototypeOf(obj);
pro.getMethod = function () {
  console.log('this is a function');
};
Run Code Online (Sandbox Code Playgroud)

正如@bergi 指出的那样,getMethod如果我们遵循上述方法,则存在将加到所有实例中的风险。但为了避免这种情况,你也可以这样做,

var obj = { firstname: 'foo', lastname:'bar' };
Object.setPrototypeOf(obj, Object.create({getMethod : function(){
  console.log("Hello");
}}));

console.log(obj.getMethod()); //"Hello"
Run Code Online (Sandbox Code Playgroud)