如何使用Object创建原型?

时间:2017-10-24 06:18:17

标签: javascript

我试图让Object.create(String.prototype)正常运作。但是,出于某种原因,它永远不会奏效。

我拥有什么



let s = Object.create(String.prototype);

s.one = function () {console.log("I'm working")};
s.two = function () {console.log("I'm working too")};

a = 'String'

a.one()//Suppose to log I'm working
a.two()//Suppose to log I'm working too





它是如何工作的



String.prototype.one = function () {console.log("I'm working")};
String.prototype.two = function () {console.log("I'm working too")};

a = 'String'

a.one()//Suppose to log I'm working
a.two()//Suppose to log I'm working too




3 个答案:

答案 0 :(得分:3)

  

但是,出于某种原因,它永远不会奏效。

您向s添加了两个属性,但由于您未使用Object.create(),因此未继承这些属性。

替换

a = 'String'

a = Object.create(s);

let s = Object.create(String.prototype);

s.one = function () {console.log("I'm working")};
s.two = function () {console.log("I'm working too")};

a = Object.create(s);

a.one()//Suppose to log I'm working
a.two()//Suppose to log I'm working too

答案 1 :(得分:2)

Object.create创建一个空对象,其原型是给定对象 - 在您的情况下为String.prototype。因此,当您向Object.create的返回结果添加内容时,它会添加到空对象本身,而不是String.prototypeas对象无关。

第二种情况是直接将函数添加到String.prototype

您可以看到s对象

的内容



let s = Object.create(String.prototype);

s.one = function () {console.log("I'm working")};
s.two = function () {console.log("I'm working too")};

console.log(s);




因此,我认为您希望将a的原型设置为s,以便能够访问onetwo个功能。



let s = Object.create(String.prototype);

s.one = function () {console.log("I'm working")};
s.two = function () {console.log("I'm working too")};

a = Object.create(s);

a.one()
a.two()




答案 2 :(得分:2)

let s = Object.create(String.prototype);

s.one = function () {console.log("I'm working")};
s.two = function () {console.log("I'm working too")};

a = 'String'

a.one()//Suppose to log I'm working
a.two()//Suppose to log I'm working too

因此,您似乎正在尝试创建一个具有名为onetwo的特定行为的对象。该对象还将提供String原型的方法。问题是,你构建它的方式,没有办法将原始值分配给sObject.create接受第二个参数,但这是用于在创建的对象上设置特定属性,而不是原始值,这是不可能的。

as无关。你为什么认为它呢?

如果你想扩展String原型,那就这样做:

String.prototype.one = function() { console.log("I'm working"); };

'whatever'.one();

如果要扩展String类,则在ES6中

class MyString extends String {
  one() { console.log("hi"); }
  two() { console.log("hello"); }
}
  
const myString = new MyString("foobar");
console.log(typeof myString);
console.log("Is myString a sort of string?", myString instanceof String);
myString.one();