我试图让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

答案 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.prototype
。 a
与s
对象无关。
第二种情况是直接将函数添加到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
,以便能够访问one
和two
个功能。
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
因此,您似乎正在尝试创建一个具有名为one
和two
的特定行为的对象。该对象还将提供String
原型的方法。问题是,你构建它的方式,没有办法将原始值分配给s
。 Object.create
接受第二个参数,但这是用于在创建的对象上设置特定属性,而不是原始值,这是不可能的。
a
与s
无关。你为什么认为它呢?
如果你想扩展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();